From 025b47669f7d26fa2b92a1ad72631f0868dce22f Mon Sep 17 00:00:00 2001 From: FalsePattern <30945458+FalsePattern@users.noreply.github.com> Date: Wed, 8 Jun 2022 16:01:06 +0200 Subject: [PATCH] reformat code --- .../java/com/falsepattern/lib/StableAPI.java | 10 +- .../com/falsepattern/lib/compat/BlockPos.java | 212 +++++++++------- .../com/falsepattern/lib/compat/ChunkPos.java | 11 +- .../com/falsepattern/lib/compat/GuiLabel.java | 31 +-- .../com/falsepattern/lib/compat/Rotation.java | 9 +- .../com/falsepattern/lib/compat/Vec3i.java | 42 +-- .../com/falsepattern/lib/config/Config.java | 16 +- .../lib/config/ConfigurationManager.java | 240 +++++++++++------- .../lib/config/IConfigElementProxy.java | 2 +- .../lib/dependencies/ComplexVersion.java | 10 +- .../lib/dependencies/DependencyLoader.java | 136 +++++++--- .../lib/dependencies/SemanticVersion.java | 33 +-- .../lib/dependencies/Version.java | 13 +- .../lib/internal/CoreLoadingPlugin.java | 3 +- .../lib/internal/FalsePatternLib.java | 13 +- .../com/falsepattern/lib/mixin/IMixin.java | 27 +- .../falsepattern/lib/mixin/IMixinPlugin.java | 64 +++-- .../falsepattern/lib/mixin/ITargetedMod.java | 5 +- .../lib/mixin/MinecraftURLClassPath.java | 18 +- .../falsepattern/lib/text/FormattedText.java | 172 ++++++++----- .../falsepattern/lib/util/ResourceUtil.java | 162 +++++++----- 21 files changed, 731 insertions(+), 498 deletions(-) diff --git a/src/main/java/com/falsepattern/lib/StableAPI.java b/src/main/java/com/falsepattern/lib/StableAPI.java index 2e72f8d..73b804e 100644 --- a/src/main/java/com/falsepattern/lib/StableAPI.java +++ b/src/main/java/com/falsepattern/lib/StableAPI.java @@ -7,13 +7,13 @@ import java.lang.annotation.RetentionPolicy; /** * Anything annotated with this annotation will be considered stable, and the class/method/field will not get breaking * changes without a full deprecation cycle. - * - * If a class or method is NOT annotated with this annotation, it will be considered unstable, and the package/method arguments/etc. - * can freely change between patch releases without notice. - * + *

+ * If a class or method is NOT annotated with this annotation, it will be considered unstable, and the package/method + * arguments/etc. can freely change between patch releases without notice. + *

* If a class is annotated with this annotation, all currently existing public and protected members in the class will * be considered stable. - * + *

* Private members will never be considered stable, and can be removed without notice. */ @Documented diff --git a/src/main/java/com/falsepattern/lib/compat/BlockPos.java b/src/main/java/com/falsepattern/lib/compat/BlockPos.java index 4e7e229..c59c9d2 100644 --- a/src/main/java/com/falsepattern/lib/compat/BlockPos.java +++ b/src/main/java/com/falsepattern/lib/compat/BlockPos.java @@ -4,7 +4,13 @@ import com.falsepattern.lib.StableAPI; import com.google.common.collect.AbstractIterator; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import lombok.*; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.concurrent.Immutable; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; +import lombok.val; import net.minecraft.entity.Entity; import net.minecraft.util.EnumFacing; import net.minecraft.util.MathHelper; @@ -12,11 +18,12 @@ import net.minecraft.util.Vec3; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import javax.annotation.concurrent.Immutable; -import java.util.ArrayList; -import java.util.List; - -import static net.minecraft.util.EnumFacing.*; +import static net.minecraft.util.EnumFacing.DOWN; +import static net.minecraft.util.EnumFacing.EAST; +import static net.minecraft.util.EnumFacing.NORTH; +import static net.minecraft.util.EnumFacing.SOUTH; +import static net.minecraft.util.EnumFacing.UP; +import static net.minecraft.util.EnumFacing.WEST; @Immutable @StableAPI(since = "0.6.0") @@ -35,18 +42,14 @@ public class BlockPos extends Vec3i { private static final long Z_MASK = (1L << NUM_Z_BITS) - 1L; private static final long X_MASK = (1L << NUM_X_BITS) - 1L; - public BlockPos(int x, int y, int z) { - super(x, y, z); + public BlockPos(@NonNull Entity source) { + this(source.posX, source.posY, source.posZ); } public BlockPos(double x, double y, double z) { super(x, y, z); } - public BlockPos(@NonNull Entity source) { - this(source.posX, source.posY, source.posZ); - } - public BlockPos(@NonNull Vec3 vec) { this(vec.xCoord, vec.yCoord, vec.zCoord); } @@ -55,46 +58,47 @@ public class BlockPos extends Vec3i { this(source.getX(), source.getY(), source.getZ()); } + public BlockPos(int x, int y, int z) { + super(x, y, z); + } + /** * Create a BlockPos from a serialized long value (created by toLong) */ public static BlockPos fromLong(long serialized) { - return new BlockPos( - (int) (serialized << 64 - X_SHIFT - NUM_X_BITS >> 64 - NUM_X_BITS), - (int) (serialized << 64 - Y_SHIFT - NUM_Y_BITS >> 64 - NUM_Y_BITS), - (int) (serialized << 64 - NUM_Z_BITS >> 64 - NUM_Z_BITS) - ); - } - - public long toLong() { - return ((long) x & X_MASK) << X_SHIFT | ((long) y & Y_MASK) << Y_SHIFT | ((long) z & Z_MASK); + return new BlockPos((int) (serialized << 64 - X_SHIFT - NUM_X_BITS >> 64 - NUM_X_BITS), + (int) (serialized << 64 - Y_SHIFT - NUM_Y_BITS >> 64 - NUM_Y_BITS), + (int) (serialized << 64 - NUM_Z_BITS >> 64 - NUM_Z_BITS)); } /** * Create an Iterable that returns all positions in the box specified by the given corners. There is no requirement * that one corner is greater than the other; individual coordinates will be swapped as needed. *

- * In situations where it is usable, prefer {@link #getAllInBoxMutable(BlockPos, BlockPos) instead as it has better - * performance (fewer allocations) + * In situations where it is usable, prefer + * {@link #getAllInBoxMutable(BlockPos, BlockPos) instead as it has better performance (fewer allocations) * * @param from One corner of the box * @param to Another corner of the box + * * @see #getAllInBox(int, int, int, int, int, int) * @see #getAllInBoxMutable(BlockPos, BlockPos) */ public static Iterable getAllInBox(@NonNull BlockPos from, @NonNull BlockPos to) { - return getAllInBox( - Math.min(from.getX(), to.getX()), Math.min(from.getY(), to.getY()), Math.min(from.getZ(), to.getZ()), - Math.max(from.getX(), to.getX()), Math.max(from.getY(), to.getY()), Math.max(from.getZ(), to.getZ()) - ); + return getAllInBox(Math.min(from.getX(), to.getX()), + Math.min(from.getY(), to.getY()), + Math.min(from.getZ(), to.getZ()), + Math.max(from.getX(), to.getX()), + Math.max(from.getY(), to.getY()), + Math.max(from.getZ(), to.getZ())); } /** * Create an Iterable that returns all positions in the box specified by the coordinates. Coordinates must * be in order; e.g. x0 <= x1. *

- * In situations where it is usable, prefer {@link #getAllInBoxMutable(BlockPos, BlockPos) instead as it has better - * performance (fewer allocations) + * In situations where it is usable, prefer + * {@link #getAllInBoxMutable(BlockPos, BlockPos) instead as it has better performance (fewer allocations) * * @param x0 The lower x coordinate * @param y0 The lower y coordinate @@ -102,11 +106,16 @@ public class BlockPos extends Vec3i { * @param x1 The upper x coordinate * @param y1 The upper y coordinate * @param z1 The upper z coordinate + * * @see #getAllInBox(BlockPos, BlockPos) * @see #getAllInBoxMutable(BlockPos, BlockPos) */ - public static Iterable getAllInBox(final int x0, final int y0, final int z0, - final int x1, final int y1, final int z1) { + public static Iterable getAllInBox(final int x0, + final int y0, + final int z0, + final int x1, + final int y1, + final int z1) { return () -> new AbstractIterator() { private boolean first = true; private int lastX; @@ -122,8 +131,9 @@ public class BlockPos extends Vec3i { lastZ = z0; return new BlockPos(x0, y0, z0); } - if (lastX == x1 && lastY == y1 && lastZ == z1) + if (lastX == x1 && lastY == y1 && lastZ == z1) { return endOfData(); + } if (lastX < x1) { lastX++; } else if (lastY < y1) { @@ -150,14 +160,18 @@ public class BlockPos extends Vec3i { * * @param from One corner of the box * @param to Another corner of the box + * * @see #getAllInBox(BlockPos, BlockPos) * @see #getAllInBox(int, int, int, int, int, int) * @see #getAllInBoxMutable(BlockPos, BlockPos) */ public static Iterable getAllInBoxMutable(@NonNull BlockPos from, @NonNull BlockPos to) { - return getAllInBoxMutable( - Math.min(from.getX(), to.getX()), Math.min(from.getY(), to.getY()), Math.min(from.getZ(), to.getZ()), - Math.max(from.getX(), to.getX()), Math.max(from.getY(), to.getY()), Math.max(from.getZ(), to.getZ())); + return getAllInBoxMutable(Math.min(from.getX(), to.getX()), + Math.min(from.getY(), to.getY()), + Math.min(from.getZ(), to.getZ()), + Math.max(from.getX(), to.getX()), + Math.max(from.getY(), to.getY()), + Math.max(from.getZ(), to.getZ())); } /** @@ -175,12 +189,17 @@ public class BlockPos extends Vec3i { * @param x1 The upper x coordinate * @param y1 The upper y coordinate * @param z1 The upper z coordinate + * * @see #getAllInBox(BlockPos, BlockPos) * @see #getAllInBox(int, int, int, int, int, int) * @see #getAllInBoxMutable(BlockPos, BlockPos) */ - public static Iterable getAllInBoxMutable(final int x0, final int y0, final int z0, - final int x1, final int y1, final int z1) { + public static Iterable getAllInBoxMutable(final int x0, + final int y0, + final int z0, + final int x1, + final int y1, + final int z1) { return () -> new AbstractIterator() { private MutableBlockPos pos; @@ -208,21 +227,17 @@ public class BlockPos extends Vec3i { }; } - /** - * Add the given coordinates to the coordinates of this BlockPos - */ - public BlockPos add(double x, double y, double z) { - if (x == 0.0D && y == 0.0D && z == 0.0D) - return this; - return new BlockPos(this.x + x, this.y + y, this.z + z); + public long toLong() { + return ((long) x & X_MASK) << X_SHIFT | ((long) y & Y_MASK) << Y_SHIFT | ((long) z & Z_MASK); } /** * Add the given coordinates to the coordinates of this BlockPos */ - public BlockPos add(int x, int y, int z) { - if (x == 0 && y == 0 && z == 0) + public BlockPos add(double x, double y, double z) { + if (x == 0.0D && y == 0.0D && z == 0.0D) { return this; + } return new BlockPos(this.x + x, this.y + y, this.z + z); } @@ -233,6 +248,16 @@ public class BlockPos extends Vec3i { return add(vec.getX(), vec.getY(), vec.getZ()); } + /** + * Add the given coordinates to the coordinates of this BlockPos + */ + public BlockPos add(int x, int y, int z) { + if (x == 0 && y == 0 && z == 0) { + return this; + } + return new BlockPos(this.x + x, this.y + y, this.z + z); + } + /** * Subtract the given Vector from this BlockPos */ @@ -248,6 +273,15 @@ public class BlockPos extends Vec3i { return offset(UP, blocks); } + public BlockPos offset(@NonNull EnumFacing facing, int blocks) { + if (blocks == 0) { + return this; + } + return new BlockPos(x + facing.getFrontOffsetX() * blocks, + y + facing.getFrontOffsetY() * blocks, + z + facing.getFrontOffsetZ() * blocks); + } + public BlockPos down() { return down(1); } @@ -292,16 +326,6 @@ public class BlockPos extends Vec3i { return offset(facing, 1); } - public BlockPos offset(@NonNull EnumFacing facing, int blocks) { - if (blocks == 0) - return this; - return new BlockPos( - x + facing.getFrontOffsetX() * blocks, - y + facing.getFrontOffsetY() * blocks, - z + facing.getFrontOffsetZ() * blocks - ); - } - public BlockPos rotate(@NonNull Rotation rotation) { switch (rotation) { case NONE: @@ -318,11 +342,9 @@ public class BlockPos extends Vec3i { @Override public BlockPos crossProduct(@NonNull Vec3i vec) { - return new BlockPos( - y * vec.getZ() - z * vec.getY(), - z * vec.getX() - x * vec.getZ(), - x * vec.getY() - y * vec.getX() - ); + return new BlockPos(y * vec.getZ() - z * vec.getY(), + z * vec.getX() - x * vec.getZ(), + x * vec.getY() - y * vec.getX()); } public BlockPos toImmutable() { @@ -380,12 +402,17 @@ public class BlockPos extends Vec3i { return super.rotate(rotation).toImmutable(); } + public BlockPos toImmutable() { + return new BlockPos(this); + } + + @SideOnly(Side.CLIENT) + public BlockPos.MutableBlockPos setPos(@NonNull Entity entity) { + return this.setPos(entity.posX, entity.posY, entity.posZ); + } + public BlockPos.MutableBlockPos setPos(double x, double y, double z) { - return setPos( - MathHelper.floor_double(x), - MathHelper.floor_double(y), - MathHelper.floor_double(z) - ); + return setPos(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)); } public BlockPos.MutableBlockPos setPos(int x, int y, int z) { @@ -395,11 +422,6 @@ public class BlockPos extends Vec3i { return this; } - @SideOnly(Side.CLIENT) - public BlockPos.MutableBlockPos setPos(@NonNull Entity entity) { - return this.setPos(entity.posX, entity.posY, entity.posZ); - } - public BlockPos.MutableBlockPos setPos(@NonNull Vec3i vec) { return this.setPos(vec.getX(), vec.getY(), vec.getZ()); } @@ -409,15 +431,9 @@ public class BlockPos extends Vec3i { } public BlockPos.MutableBlockPos move(@NonNull EnumFacing facing, int blocks) { - return this.setPos( - x + facing.getFrontOffsetX() * blocks, - y + facing.getFrontOffsetY() * blocks, - z + facing.getFrontOffsetZ() * blocks - ); - } - - public BlockPos toImmutable() { - return new BlockPos(this); + return this.setPos(x + facing.getFrontOffsetX() * blocks, + y + facing.getFrontOffsetY() * blocks, + z + facing.getFrontOffsetZ() * blocks); } } @@ -433,15 +449,6 @@ public class BlockPos extends Vec3i { return retain(0, 0, 0); } - public static BlockPos.PooledMutableBlockPos retain(double x, double y, double z) { - return retain(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)); - } - - @SideOnly(Side.CLIENT) - public static BlockPos.PooledMutableBlockPos retain(@NonNull Vec3i vec) { - return retain(vec.getX(), vec.getY(), vec.getZ()); - } - public static BlockPos.PooledMutableBlockPos retain(int x, int y, int z) { synchronized (POOL) { if (!POOL.isEmpty()) { @@ -456,6 +463,15 @@ public class BlockPos extends Vec3i { return new BlockPos.PooledMutableBlockPos(x, y, z); } + public static BlockPos.PooledMutableBlockPos retain(double x, double y, double z) { + return retain(MathHelper.floor_double(x), MathHelper.floor_double(y), MathHelper.floor_double(z)); + } + + @SideOnly(Side.CLIENT) + public static BlockPos.PooledMutableBlockPos retain(@NonNull Vec3i vec) { + return retain(vec.getX(), vec.getY(), vec.getZ()); + } + public void release() { synchronized (POOL) { if (POOL.size() < 100) { @@ -465,15 +481,6 @@ public class BlockPos extends Vec3i { } } - @Override - public BlockPos.PooledMutableBlockPos setPos(int x, int y, int z) { - if (released) { - BlockPos.LOGGER.error("PooledMutableBlockPosition modified after it was released.", new Throwable()); - released = false; - } - return (BlockPos.PooledMutableBlockPos) super.setPos(x, y, z); - } - @Override @SideOnly(Side.CLIENT) public BlockPos.PooledMutableBlockPos setPos(@NonNull Entity entity) { @@ -485,6 +492,15 @@ public class BlockPos extends Vec3i { return (BlockPos.PooledMutableBlockPos) super.setPos(x, y, z); } + @Override + public BlockPos.PooledMutableBlockPos setPos(int x, int y, int z) { + if (released) { + BlockPos.LOGGER.error("PooledMutableBlockPosition modified after it was released.", new Throwable()); + released = false; + } + return (BlockPos.PooledMutableBlockPos) super.setPos(x, y, z); + } + @Override public BlockPos.PooledMutableBlockPos setPos(@NonNull Vec3i vec) { return (BlockPos.PooledMutableBlockPos) super.setPos(vec); diff --git a/src/main/java/com/falsepattern/lib/compat/ChunkPos.java b/src/main/java/com/falsepattern/lib/compat/ChunkPos.java index b16908e..0e4f9f6 100644 --- a/src/main/java/com/falsepattern/lib/compat/ChunkPos.java +++ b/src/main/java/com/falsepattern/lib/compat/ChunkPos.java @@ -1,10 +1,12 @@ package com.falsepattern.lib.compat; import com.falsepattern.lib.StableAPI; -import lombok.*; -import net.minecraft.entity.Entity; - import javax.annotation.concurrent.Immutable; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.NonNull; +import lombok.val; +import net.minecraft.entity.Entity; /** * A functional equivalent to ChunkPos present in Minecraft 1.12. @@ -38,6 +40,7 @@ public class ChunkPos { * * @param x the chunk x * @param z the chunk x + * * @return the unique chunk long */ public static long asLong(int x, int z) { @@ -48,6 +51,7 @@ public class ChunkPos { * Gets distance sq. * * @param entity the entity + * * @return the distance sq */ public double getDistanceSq(@NonNull Entity entity) { @@ -98,6 +102,7 @@ public class ChunkPos { * @param x the x pos * @param y the y pos * @param z the z pos + * * @return the relative block position */ public BlockPos getBlock(int x, int y, int z) { diff --git a/src/main/java/com/falsepattern/lib/compat/GuiLabel.java b/src/main/java/com/falsepattern/lib/compat/GuiLabel.java index ceb027e..7bd88c0 100644 --- a/src/main/java/com/falsepattern/lib/compat/GuiLabel.java +++ b/src/main/java/com/falsepattern/lib/compat/GuiLabel.java @@ -1,11 +1,12 @@ package com.falsepattern.lib.compat; -import java.util.ArrayList; -import java.util.List; - import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import lombok.*; +import java.util.ArrayList; +import java.util.List; +import lombok.NonNull; +import lombok.val; +import lombok.var; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; @@ -21,16 +22,6 @@ public class GuiLabel extends Gui { private final List lines = new ArrayList<>(); private final FontRenderer fontRenderer; private final int textColor; - - private boolean centered = false; - /** - * The label width. - */ - protected int width; - /** - * The label height. - */ - protected int height; /** * The id of the label. */ @@ -47,6 +38,15 @@ public class GuiLabel extends Gui { * The visibility of the label. */ public boolean visible = true; + /** + * The label width. + */ + protected int width; + /** + * The label height. + */ + protected int height; + private boolean centered = false; /** * Instantiates a new Gui label. @@ -97,8 +97,9 @@ public class GuiLabel extends Gui { * @param mouseY the mouse y */ public void drawLabel(@NonNull Minecraft minecraft, int mouseX, int mouseY) { - if (!visible) + if (!visible) { return; + } GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); diff --git a/src/main/java/com/falsepattern/lib/compat/Rotation.java b/src/main/java/com/falsepattern/lib/compat/Rotation.java index 3f91361..a1219b9 100644 --- a/src/main/java/com/falsepattern/lib/compat/Rotation.java +++ b/src/main/java/com/falsepattern/lib/compat/Rotation.java @@ -1,14 +1,15 @@ package com.falsepattern.lib.compat; import com.falsepattern.lib.StableAPI; -import lombok.*; +import lombok.NonNull; import net.minecraft.util.EnumFacing; -import java.util.Arrays; - @StableAPI(since = "0.6.0") public enum Rotation { - NONE, CLOCKWISE_90, CLOCKWISE_180, COUNTERCLOCKWISE_90; + NONE, + CLOCKWISE_90, + CLOCKWISE_180, + COUNTERCLOCKWISE_90; public Rotation add(@NonNull Rotation rotation) { switch (rotation) { diff --git a/src/main/java/com/falsepattern/lib/compat/Vec3i.java b/src/main/java/com/falsepattern/lib/compat/Vec3i.java index 840de1d..9d09475 100644 --- a/src/main/java/com/falsepattern/lib/compat/Vec3i.java +++ b/src/main/java/com/falsepattern/lib/compat/Vec3i.java @@ -1,10 +1,13 @@ package com.falsepattern.lib.compat; import com.falsepattern.lib.StableAPI; -import lombok.*; -import net.minecraft.util.MathHelper; - import javax.annotation.concurrent.Immutable; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NonNull; +import lombok.val; +import net.minecraft.util.MathHelper; /** * A functional equivalent to Vec3i present in Minecraft 1.12. @@ -43,14 +46,13 @@ public class Vec3i implements Comparable { * Cross product between two vectors. * * @param vec the other vector + * * @return the new resulting vector */ public Vec3i crossProduct(@NonNull Vec3i vec) { - return new Vec3i( - y * vec.getZ() - z * vec.getY(), - z * vec.getX() - x * vec.getZ(), - x * vec.getY() - y * vec.getX() - ); + return new Vec3i(y * vec.getZ() - z * vec.getY(), + z * vec.getX() - x * vec.getZ(), + x * vec.getY() - y * vec.getX()); } /** @@ -59,28 +61,20 @@ public class Vec3i implements Comparable { * @param x the other x * @param y the other y * @param z the other z + * * @return the distance */ public double getDistance(int x, int y, int z) { return Math.sqrt(distanceSq(x, y, z)); } - /** - * Square distance between vectors. - * - * @param vec the other vector - * @return the square distance - */ - public double distanceSq(@NonNull Vec3i vec) { - return distanceSq(vec.getX(), vec.getY(), vec.getZ()); - } - /** * Square root distance to a point. * * @param x the other x * @param y the other y * @param z the other z + * * @return the square distance */ public double distanceSq(int x, int y, int z) { @@ -90,12 +84,24 @@ public class Vec3i implements Comparable { return dX * dX + dY * dY + dZ * dZ; } + /** + * Square distance between vectors. + * + * @param vec the other vector + * + * @return the square distance + */ + public double distanceSq(@NonNull Vec3i vec) { + return distanceSq(vec.getX(), vec.getY(), vec.getZ()); + } + /** * Square distance between point to center of this Block. * * @param x the other x * @param y the other y * @param z the other z + * * @return the square distance to center */ public double distanceSqToCenter(double x, double y, double z) { diff --git a/src/main/java/com/falsepattern/lib/config/Config.java b/src/main/java/com/falsepattern/lib/config/Config.java index 8160114..889e029 100644 --- a/src/main/java/com/falsepattern/lib/config/Config.java +++ b/src/main/java/com/falsepattern/lib/config/Config.java @@ -1,8 +1,11 @@ package com.falsepattern.lib.config; import com.falsepattern.lib.StableAPI; - -import java.lang.annotation.*; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @@ -33,7 +36,8 @@ public @interface Config { @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) - @interface Ignore {} + @interface Ignore { + } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) @@ -95,9 +99,11 @@ public @interface Config { @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) - @interface RequiresMcRestart {} + @interface RequiresMcRestart { + } @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) - @interface RequiresWorldRestart {} + @interface RequiresWorldRestart { + } } \ No newline at end of file diff --git a/src/main/java/com/falsepattern/lib/config/ConfigurationManager.java b/src/main/java/com/falsepattern/lib/config/ConfigurationManager.java index 2e89842..ba1e713 100644 --- a/src/main/java/com/falsepattern/lib/config/ConfigurationManager.java +++ b/src/main/java/com/falsepattern/lib/config/ConfigurationManager.java @@ -7,17 +7,25 @@ import cpw.mods.fml.client.config.IConfigElement; import cpw.mods.fml.client.event.ConfigChangedEvent; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import lombok.*; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.config.ConfigElement; -import net.minecraftforge.common.config.Configuration; - import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.nio.file.Path; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.regex.Pattern; import java.util.stream.Collectors; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import lombok.val; +import lombok.var; +import net.minecraftforge.common.config.ConfigElement; +import net.minecraftforge.common.config.Configuration; /** * Class for controlling the loading of configuration files. @@ -37,16 +45,17 @@ public class ConfigurationManager { /** * Registers a configuration class to be loaded. This should be done in preInit. + * * @param configClass The class to register. */ public static void registerConfig(Class configClass) throws ConfigException { - val cfg = Optional - .ofNullable(configClass.getAnnotation(Config.class)) - .orElseThrow(() -> new ConfigException("Class " + configClass.getName() + " does not have a @Config annotation!")); - val category = Optional - .of(cfg.category().trim()) - .map((cat) -> cat.length() == 0 ? null : cat) - .orElseThrow(() -> new ConfigException("Config class " + configClass.getName() + " has an empty category!")); + val cfg = Optional.ofNullable(configClass.getAnnotation(Config.class)) + .orElseThrow(() -> new ConfigException( + "Class " + configClass.getName() + " does not have a @Config annotation!")); + val category = Optional.of(cfg.category().trim()) + .map((cat) -> cat.length() == 0 ? null : cat) + .orElseThrow(() -> new ConfigException( + "Config class " + configClass.getName() + " has an empty category!")); val rawConfig = configs.computeIfAbsent(cfg.modid(), (ignored) -> { val c = new Configuration(configDir.resolve(cfg.modid() + ".cfg").toFile()); c.load(); @@ -61,103 +70,74 @@ public class ConfigurationManager { } } - /** - * Process the configuration into a list of config elements usable in config GUI code. - * @param configClass The class to process. - * @return The configuration elements. - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - public static List getConfigElements(Class configClass) throws ConfigException { - val cfg = Optional - .ofNullable(configClass.getAnnotation(Config.class)) - .orElseThrow(() -> new ConfigException("Class " + configClass.getName() + " does not have a @Config annotation!")); - val rawConfig = Optional - .ofNullable(configs.get(cfg.modid())) - .map((conf) -> Optional.ofNullable(configToClassMap.get(conf)) - .map((l) -> l.contains(configClass)) - .orElse(false) ? conf : null) - .orElseThrow(() -> new ConfigException("Tried to get config elements for non-registed config class!")); - val category = cfg.category(); - val elements = new ConfigElement<>(rawConfig.getCategory(category)).getChildElements(); - return elements.stream().map((element) -> new IConfigElementProxy(element, () -> { - try { - processConfigInternal(configClass, category, rawConfig); - rawConfig.save(); - } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException | - NoSuchFieldException | ConfigException e) { - e.printStackTrace(); - } - })).collect(Collectors.toList()); - } - - /** - * Internal, do not use. - */ - public static void init() { - if (initialized) return; - configDir = CoreLoadingPlugin.mcDir.toPath().resolve("config"); - FMLCommonHandler.instance().bus().register(instance); - initialized = true; - } - - /** - * Internal, do not use. - * @param event The event. - */ - @SubscribeEvent - public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) { - val config = configs.get(event.modID); - if (config == null) - return; - val configClasses = configToClassMap.get(config); - configClasses.forEach((configClass) -> { - try { - val category = Optional.ofNullable(configClass.getAnnotation(Config.class)).map(Config::category).orElseThrow(() -> new ConfigException("Failed to get config category for class " + configClass.getName())); - processConfigInternal(configClass, category, config); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - private static void processConfigInternal(Class configClass, String category, Configuration rawConfig) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException, ConfigException { + private static void processConfigInternal(Class configClass, String category, Configuration rawConfig) + throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException, + ConfigException { val cat = rawConfig.getCategory(category); - for (val field: configClass.getDeclaredFields()) { - if (field.getAnnotation(Config.Ignore.class) != null) continue; + for (val field : configClass.getDeclaredFields()) { + if (field.getAnnotation(Config.Ignore.class) != null) { + continue; + } field.setAccessible(true); - val comment = Optional.ofNullable(field.getAnnotation(Config.Comment.class)).map(Config.Comment::value).map((lines) -> String.join("\n", lines)).orElse(""); - val name = Optional.ofNullable(field.getAnnotation(Config.Name.class)).map(Config.Name::value).orElse(field.getName()); - val langKey = Optional.ofNullable(field.getAnnotation(Config.LangKey.class)).map(Config.LangKey::value).orElse(name); + val comment = Optional.ofNullable(field.getAnnotation(Config.Comment.class)) + .map(Config.Comment::value) + .map((lines) -> String.join("\n", lines)) + .orElse(""); + val name = Optional.ofNullable(field.getAnnotation(Config.Name.class)) + .map(Config.Name::value) + .orElse(field.getName()); + val langKey = Optional.ofNullable(field.getAnnotation(Config.LangKey.class)) + .map(Config.LangKey::value) + .orElse(name); val fieldClass = field.getType(); var boxed = false; if ((boxed = fieldClass.equals(Boolean.class)) || fieldClass.equals(boolean.class)) { - val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultBoolean.class)).map(Config.DefaultBoolean::value).orElse(boxed ? (Boolean) field.get(null) : field.getBoolean(null)); + val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultBoolean.class)) + .map(Config.DefaultBoolean::value) + .orElse(boxed ? (Boolean) field.get(null) : field.getBoolean(null)); field.setBoolean(null, rawConfig.getBoolean(name, category, defaultValue, comment, langKey)); } else if ((boxed = fieldClass.equals(Integer.class)) || fieldClass.equals(int.class)) { val range = Optional.ofNullable(field.getAnnotation(Config.RangeInt.class)); val min = range.map(Config.RangeInt::min).orElse(Integer.MIN_VALUE); val max = range.map(Config.RangeInt::max).orElse(Integer.MAX_VALUE); - val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultInt.class)).map(Config.DefaultInt::value).orElse(boxed ? (Integer)field.get(null) : field.getInt(null)); + val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultInt.class)) + .map(Config.DefaultInt::value) + .orElse(boxed ? (Integer) field.get(null) : field.getInt(null)); field.setInt(null, rawConfig.getInt(name, category, defaultValue, min, max, comment, langKey)); } else if ((boxed = fieldClass.equals(Float.class)) || fieldClass.equals(float.class)) { val range = Optional.ofNullable(field.getAnnotation(Config.RangeFloat.class)); val min = range.map(Config.RangeFloat::min).orElse(Float.MIN_VALUE); val max = range.map(Config.RangeFloat::max).orElse(Float.MAX_VALUE); - val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultFloat.class)).map(Config.DefaultFloat::value).orElse(boxed ? (Float) field.get(null) : field.getFloat(null)); + val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultFloat.class)) + .map(Config.DefaultFloat::value) + .orElse(boxed ? (Float) field.get(null) : field.getFloat(null)); field.setFloat(null, rawConfig.getFloat(name, category, defaultValue, min, max, comment, langKey)); } else if (fieldClass.equals(String.class)) { - val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultString.class)).map(Config.DefaultString::value).orElse((String)field.get(null)); - val pattern = Optional.ofNullable(field.getAnnotation(Config.Pattern.class)).map(Config.Pattern::value).map(Pattern::compile).orElse(null); + val defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultString.class)) + .map(Config.DefaultString::value) + .orElse((String) field.get(null)); + val pattern = Optional.ofNullable(field.getAnnotation(Config.Pattern.class)) + .map(Config.Pattern::value) + .map(Pattern::compile) + .orElse(null); field.set(null, rawConfig.getString(name, category, defaultValue, comment, langKey, pattern)); } else if (fieldClass.isEnum()) { - val enumValues = Arrays.stream((Object[])fieldClass.getDeclaredMethod("values").invoke(null)).map((obj) -> (Enum)obj).collect(Collectors.toList()); - val defaultValue = (Enum) - Optional.ofNullable(field.getAnnotation(Config.DefaultEnum.class)) - .map(Config.DefaultEnum::value) - .map((defName) -> extractField(fieldClass, defName)) - .map(ConfigurationManager::extractValue) - .orElse(field.get(null)); + val enumValues = Arrays.stream((Object[]) fieldClass.getDeclaredMethod("values").invoke(null)) + .map((obj) -> (Enum) obj) + .collect(Collectors.toList()); + val defaultValue = (Enum) Optional.ofNullable(field.getAnnotation(Config.DefaultEnum.class)) + .map(Config.DefaultEnum::value) + .map((defName) -> extractField(fieldClass, defName)) + .map(ConfigurationManager::extractValue) + .orElse(field.get(null)); val possibleValues = enumValues.stream().map(Enum::name).toArray(String[]::new); - var value = rawConfig.getString(name, category, defaultValue.name(), comment + "\nPossible values: " + Arrays.toString(possibleValues) + "\n", possibleValues, langKey); + var value = rawConfig.getString(name, + category, + defaultValue.name(), + comment + "\nPossible values: " + Arrays.toString(possibleValues) + + "\n", + possibleValues, + langKey); try { if (!Arrays.asList(possibleValues).contains(value)) { @@ -169,11 +149,16 @@ public class ConfigurationManager { } field.set(null, enumField.get(null)); } catch (NoSuchFieldException e) { - FalsePatternLib.getLog().warn("Invalid value " + value + " for enum configuration field " + field.getName() + " of type " + fieldClass.getName() + " in config class " + configClass.getName() + "! Using default value of " + defaultValue + "!"); + FalsePatternLib.getLog() + .warn("Invalid value " + value + " for enum configuration field " + field.getName() + + " of type " + fieldClass.getName() + " in config class " + + configClass.getName() + "! Using default value of " + defaultValue + "!"); field.set(null, defaultValue); } } else { - throw new ConfigException("Illegal config field: " + field.getName() + " in " + configClass.getName() + ": Unsupported type " + fieldClass.getName() + "! Did you forget an @Ignore annotation?"); + throw new ConfigException("Illegal config field: " + field.getName() + " in " + configClass.getName() + + ": Unsupported type " + fieldClass.getName() + + "! Did you forget an @Ignore annotation?"); } if (field.isAnnotationPresent(Config.RequiresMcRestart.class)) { cat.setRequiresMcRestart(true); @@ -193,4 +178,75 @@ public class ConfigurationManager { private static Object extractValue(Field field) { return field.get(null); } + + /** + * Process the configuration into a list of config elements usable in config GUI code. + * + * @param configClass The class to process. + * + * @return The configuration elements. + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + public static List getConfigElements(Class configClass) throws ConfigException { + val cfg = Optional.ofNullable(configClass.getAnnotation(Config.class)) + .orElseThrow(() -> new ConfigException( + "Class " + configClass.getName() + " does not have a @Config annotation!")); + val rawConfig = Optional.ofNullable(configs.get(cfg.modid())) + .map((conf) -> Optional.ofNullable(configToClassMap.get(conf)) + .map((l) -> l.contains(configClass)) + .orElse(false) ? conf : null) + .orElseThrow(() -> new ConfigException( + "Tried to get config elements for non-registed config class!")); + val category = cfg.category(); + val elements = new ConfigElement<>(rawConfig.getCategory(category)).getChildElements(); + return elements.stream().map((element) -> new IConfigElementProxy(element, () -> { + try { + processConfigInternal(configClass, category, rawConfig); + rawConfig.save(); + } catch (IllegalAccessException | + NoSuchMethodException | + InvocationTargetException | + NoSuchFieldException | + ConfigException e) { + e.printStackTrace(); + } + })).collect(Collectors.toList()); + } + + /** + * Internal, do not use. + */ + public static void init() { + if (initialized) { + return; + } + configDir = CoreLoadingPlugin.mcDir.toPath().resolve("config"); + FMLCommonHandler.instance().bus().register(instance); + initialized = true; + } + + /** + * Internal, do not use. + * + * @param event The event. + */ + @SubscribeEvent + public void onConfigChanged(ConfigChangedEvent.OnConfigChangedEvent event) { + val config = configs.get(event.modID); + if (config == null) { + return; + } + val configClasses = configToClassMap.get(config); + configClasses.forEach((configClass) -> { + try { + val category = Optional.ofNullable(configClass.getAnnotation(Config.class)) + .map(Config::category) + .orElseThrow(() -> new ConfigException( + "Failed to get config category for class " + configClass.getName())); + processConfigInternal(configClass, category, config); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } } diff --git a/src/main/java/com/falsepattern/lib/config/IConfigElementProxy.java b/src/main/java/com/falsepattern/lib/config/IConfigElementProxy.java index 6050c8a..e8ba829 100644 --- a/src/main/java/com/falsepattern/lib/config/IConfigElementProxy.java +++ b/src/main/java/com/falsepattern/lib/config/IConfigElementProxy.java @@ -4,13 +4,13 @@ import cpw.mods.fml.client.config.ConfigGuiType; import cpw.mods.fml.client.config.GuiConfigEntries; import cpw.mods.fml.client.config.GuiEditArrayEntries; import cpw.mods.fml.client.config.IConfigElement; - import java.util.List; import java.util.regex.Pattern; public class IConfigElementProxy implements IConfigElement { private final IConfigElement proxied; private final Runnable onUpdate; + public IConfigElementProxy(IConfigElement proxied, Runnable onUpdate) { this.proxied = proxied; this.onUpdate = onUpdate; diff --git a/src/main/java/com/falsepattern/lib/dependencies/ComplexVersion.java b/src/main/java/com/falsepattern/lib/dependencies/ComplexVersion.java index ac7aa78..cab5bf0 100644 --- a/src/main/java/com/falsepattern/lib/dependencies/ComplexVersion.java +++ b/src/main/java/com/falsepattern/lib/dependencies/ComplexVersion.java @@ -1,15 +1,15 @@ package com.falsepattern.lib.dependencies; import com.falsepattern.lib.StableAPI; -import lombok.NonNull; -import lombok.val; - import java.util.Arrays; import java.util.stream.Collectors; +import lombok.NonNull; +import lombok.val; @StableAPI(since = "0.6.0") public class ComplexVersion extends Version { final Version[] versions; + public ComplexVersion(@NonNull Version mainVersion, Version... subVersions) { this.versions = new Version[subVersions.length + 1]; this.versions[0] = mainVersion; @@ -23,7 +23,9 @@ public class ComplexVersion extends Version { int count = Math.min(versions.length, other.versions.length); for (int i = 0; i < count; i++) { val result = versions[i].compareTo(other.versions[i]); - if (result != 0) return result; + if (result != 0) { + return result; + } } if (versions.length != other.versions.length) { return versions.length - other.versions.length; diff --git a/src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java b/src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java index 1f99bc4..27299e1 100644 --- a/src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java +++ b/src/main/java/com/falsepattern/lib/dependencies/DependencyLoader.java @@ -3,16 +3,22 @@ package com.falsepattern.lib.dependencies; import com.falsepattern.lib.StableAPI; import com.falsepattern.lib.internal.CoreLoadingPlugin; import com.falsepattern.lib.internal.FalsePatternLib; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import javax.net.ssl.HttpsURLConnection; import lombok.NonNull; import lombok.val; import lombok.var; import net.minecraft.launchwrapper.LaunchClassLoader; -import javax.net.ssl.HttpsURLConnection; -import java.io.*; -import java.net.URL; -import java.util.*; - @StableAPI(since = "0.6.0") public class DependencyLoader { @@ -25,39 +31,66 @@ public class DependencyLoader { mavenRepositories.add(url); } - public static void loadLibrary(String loadingModId, String groupId, String artifactId, @NonNull Version minVersion, Version maxVersion, @NonNull Version preferredVersion, String regularSuffix, String devSuffix) { + public static void loadLibrary(String loadingModId, + String groupId, + String artifactId, + @NonNull Version minVersion, + Version maxVersion, + @NonNull Version preferredVersion, + String regularSuffix, + String devSuffix) { val suffix = FalsePatternLib.isDeveloperEnvironment() ? devSuffix : regularSuffix; - FalsePatternLib.getLog().info("Adding library {}:{}:{}{}, requested by mod {}", groupId, artifactId, preferredVersion, suffix != null ? "-" + suffix : "", loadingModId); + FalsePatternLib.getLog() + .info("Adding library {}:{}:{}{}, requested by mod {}", + groupId, + artifactId, + preferredVersion, + suffix != null ? "-" + suffix : "", + loadingModId); var artifact = groupId + ":" + artifactId + ":" + suffix; if (loadedLibraries.containsKey(artifact)) { val currentVer = loadedLibraries.get(artifact); - if (currentVer.equals(preferredVersion)) return; + if (currentVer.equals(preferredVersion)) { + return; + } val rangeString = "(minimum: " + minVersion + (maxVersion == null ? "" : ", maximum: " + maxVersion) + ")"; if (minVersion.compareTo(currentVer) > 0 || (maxVersion != null && maxVersion.compareTo(currentVer) < 0)) { for (int i = 0; i < 16; i++) { FalsePatternLib.getLog().fatal("ALERT VVVVVVVVVVVV ALERT"); } - FalsePatternLib.getLog().fatal("Library {}:{}{} already loaded with version {}, " + - "but a version in the range {} was requested! Thing may go horribly wrong! " + - "Requested by mod: {}, previously loaded by mod: {}", - groupId, artifactId, suffix != null ? ":" + suffix : "", currentVer, - rangeString, - loadingModId, loadedLibraryMods.get(artifact)); + FalsePatternLib.getLog() + .fatal("Library {}:{}{} already loaded with version {}, " + + "but a version in the range {} was requested! Thing may go horribly wrong! " + + "Requested by mod: {}, previously loaded by mod: {}", + groupId, + artifactId, + suffix != null ? ":" + suffix : "", + currentVer, + rangeString, + loadingModId, + loadedLibraryMods.get(artifact)); for (int i = 0; i < 16; i++) { FalsePatternLib.getLog().fatal("ALERT ^^^^^^^^^^^^ ALERT"); } } else { - FalsePatternLib.getLog().info("Attempted loading of library {}:{}{} with preferred version {}, " + - "but version {} was already loaded, which matched the range {}. This is not an error. " + - "Requested by mod: {}, previously loaded by mod: {}", - groupId, artifactId, suffix != null ? ":" + suffix : "", preferredVersion, - currentVer, rangeString, - loadingModId, loadedLibraryMods.get(artifact)); + FalsePatternLib.getLog() + .info("Attempted loading of library {}:{}{} with preferred version {}, " + + "but version {} was already loaded, which matched the range {}. This is not an " + + "error. " + "Requested by mod: {}, previously loaded by mod: {}", + groupId, + artifactId, + suffix != null ? ":" + suffix : "", + preferredVersion, + currentVer, + rangeString, + loadingModId, + loadedLibraryMods.get(artifact)); } return; } val modsDir = new File(CoreLoadingPlugin.mcDir, "mods"); - val mavenJarName = String.format("%s-%s%s.jar", artifactId, preferredVersion, (suffix != null) ? ("-" + suffix) : ""); + val mavenJarName = + String.format("%s-%s%s.jar", artifactId, preferredVersion, (suffix != null) ? ("-" + suffix) : ""); val jarName = groupId + "-" + mavenJarName; val libDir = new File(modsDir, "falsepattern"); if (!libDir.exists()) { @@ -68,37 +101,74 @@ public class DependencyLoader { try { addToClasspath(file); loadedLibraries.put(artifact, preferredVersion); - FalsePatternLib.getLog().info("Library {}:{}:{}{} successfully loaded from disk!", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); + FalsePatternLib.getLog() + .info("Library {}:{}:{}{} successfully loaded from disk!", + groupId, + artifactId, + preferredVersion, + (suffix != null) ? ":" + suffix : ""); return; } catch (RuntimeException e) { - FalsePatternLib.getLog().warn("Failed to load library {}:{}:{}{} from file! Redownloading...", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); + FalsePatternLib.getLog() + .warn("Failed to load library {}:{}:{}{} from file! Redownloading...", + groupId, + artifactId, + preferredVersion, + (suffix != null) ? ":" + suffix : ""); file.delete(); } } - for (var repo: mavenRepositories) { + for (var repo : mavenRepositories) { try { - if (!repo.endsWith("/")) repo = repo + "/"; - val url = new URL(String.format("%s%s/%s/%s/%s", repo, groupId.replace('.', '/'), artifactId, preferredVersion, mavenJarName)); + if (!repo.endsWith("/")) { + repo = repo + "/"; + } + val url = new URL(String.format("%s%s/%s/%s/%s", + repo, + groupId.replace('.', '/'), + artifactId, + preferredVersion, + mavenJarName)); val connection = (HttpsURLConnection) url.openConnection(); connection.setConnectTimeout(1500); connection.setReadTimeout(1500); connection.setRequestProperty("User-Agent", "FalsePatternLib Downloader"); if (connection.getResponseCode() != 200) { - FalsePatternLib.getLog().info("Artifact {}:{}:{}{} was not found on repo {}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : "", repo); + FalsePatternLib.getLog() + .info("Artifact {}:{}:{}{} was not found on repo {}", + groupId, + artifactId, + preferredVersion, + (suffix != null) ? ":" + suffix : "", + repo); connection.disconnect(); continue; } - FalsePatternLib.getLog().info("Downloading {}:{}:{}{} from {}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : "", repo); + FalsePatternLib.getLog() + .info("Downloading {}:{}:{}{} from {}", + groupId, + artifactId, + preferredVersion, + (suffix != null) ? ":" + suffix : "", + repo); download(connection.getInputStream(), file); - FalsePatternLib.getLog().info("Downloaded {}:{}:{}{}", groupId, artifactId, preferredVersion, (suffix != null) ? ":" + suffix : ""); + FalsePatternLib.getLog() + .info("Downloaded {}:{}:{}{}", + groupId, + artifactId, + preferredVersion, + (suffix != null) ? ":" + suffix : ""); loadedLibraries.put(artifact, preferredVersion); loadedLibraryMods.put(artifact, loadingModId); addToClasspath(file); return; - } catch (IOException ignored) {} + } catch (IOException ignored) { + } } - val errorMessage = "Failed to download library " + groupId + ":" + artifactId + ":" + preferredVersion + ((suffix != null) ? ":" + suffix : "") + " from any repository! Requested by mod: " + loadingModId; + val errorMessage = "Failed to download library " + groupId + ":" + artifactId + ":" + preferredVersion + + ((suffix != null) ? ":" + suffix : "") + " from any repository! Requested by mod: " + + loadingModId; FalsePatternLib.getLog().fatal(errorMessage); throw new IllegalStateException(errorMessage); } @@ -114,7 +184,9 @@ public class DependencyLoader { } private static void download(InputStream is, File target) throws IOException { - if (target.exists()) return; + if (target.exists()) { + return; + } var bytesRead = 0; diff --git a/src/main/java/com/falsepattern/lib/dependencies/SemanticVersion.java b/src/main/java/com/falsepattern/lib/dependencies/SemanticVersion.java index 74aaa5b..13c908e 100644 --- a/src/main/java/com/falsepattern/lib/dependencies/SemanticVersion.java +++ b/src/main/java/com/falsepattern/lib/dependencies/SemanticVersion.java @@ -1,25 +1,23 @@ package com.falsepattern.lib.dependencies; import com.falsepattern.lib.StableAPI; +import java.util.Objects; import lombok.Builder; import lombok.Getter; import lombok.NonNull; import lombok.val; -import java.util.Objects; - @StableAPI(since = "0.6.0") public class SemanticVersion extends Version { - @Getter - private final int majorVersion; - @Getter - private final int minorVersion; - @Getter - private final int patchVersion; - @Getter - private final String preRelease; - @Getter - private final String build; + @Getter private final int majorVersion; + @Getter private final int minorVersion; + @Getter private final int patchVersion; + @Getter private final String preRelease; + @Getter private final String build; + + public SemanticVersion(int majorVersion, int minorVersion, int patchVersion, String preRelease) { + this(majorVersion, minorVersion, patchVersion, preRelease, null); + } @Builder public SemanticVersion(int majorVersion, int minorVersion, int patchVersion, String preRelease, String build) { @@ -32,10 +30,6 @@ public class SemanticVersion extends Version { this.build = "".equals(build) ? null : build; } - public SemanticVersion(int majorVersion, int minorVersion, int patchVersion, String preRelease) { - this(majorVersion, minorVersion, patchVersion, preRelease, null); - } - public SemanticVersion(int majorVersion, int minorVersion, int patchVersion) { this(majorVersion, minorVersion, patchVersion, null, null); } @@ -43,7 +37,7 @@ public class SemanticVersion extends Version { @Override public int compareTo(@NonNull Version o) { if (o instanceof ComplexVersion) { - val result = this.compareTo(((ComplexVersion)o).versions[0]); + val result = this.compareTo(((ComplexVersion) o).versions[0]); if (result != 0) { return result; } else if (((ComplexVersion) o).versions.length > 1) { @@ -52,7 +46,7 @@ public class SemanticVersion extends Version { return 0; } } else if (o instanceof SemanticVersion) { - val other = (SemanticVersion)o; + val other = (SemanticVersion) o; if (majorVersion != other.majorVersion) { return majorVersion - other.majorVersion; } else if (minorVersion != other.minorVersion) { @@ -75,6 +69,7 @@ public class SemanticVersion extends Version { @Override public String toString() { - return majorVersion + "." + minorVersion + "." + patchVersion + (preRelease == null ? "" : "-" + preRelease) + (build == null ? "" : "+" + build); + return majorVersion + "." + minorVersion + "." + patchVersion + (preRelease == null ? "" : "-" + preRelease) + + (build == null ? "" : "+" + build); } } diff --git a/src/main/java/com/falsepattern/lib/dependencies/Version.java b/src/main/java/com/falsepattern/lib/dependencies/Version.java index 9ae94b2..80ae949 100644 --- a/src/main/java/com/falsepattern/lib/dependencies/Version.java +++ b/src/main/java/com/falsepattern/lib/dependencies/Version.java @@ -4,15 +4,18 @@ import com.falsepattern.lib.StableAPI; @StableAPI(since = "0.6.0") public abstract class Version implements Comparable { - protected Version(){} - - public boolean equals(Version other) { - return compareTo(other) == 0; + protected Version() { } @Override public boolean equals(Object obj) { - if (!(obj instanceof Version)) return false; + if (!(obj instanceof Version)) { + return false; + } return equals((Version) obj); } + + public boolean equals(Version other) { + return compareTo(other) == 0; + } } diff --git a/src/main/java/com/falsepattern/lib/internal/CoreLoadingPlugin.java b/src/main/java/com/falsepattern/lib/internal/CoreLoadingPlugin.java index 4c93ff8..aa8b191 100644 --- a/src/main/java/com/falsepattern/lib/internal/CoreLoadingPlugin.java +++ b/src/main/java/com/falsepattern/lib/internal/CoreLoadingPlugin.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import cpw.mods.fml.relauncher.IFMLLoadingPlugin.MCVersion; import cpw.mods.fml.relauncher.IFMLLoadingPlugin.Name; import cpw.mods.fml.relauncher.IFMLLoadingPlugin.SortingIndex; - import java.io.File; import java.util.Map; @@ -31,7 +30,7 @@ public class CoreLoadingPlugin implements IFMLLoadingPlugin { @Override public void injectData(Map data) { - mcDir = (File)data.get("mcLocation"); + mcDir = (File) data.get("mcLocation"); } @Override diff --git a/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java b/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java index 6935cd3..9548202 100644 --- a/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java +++ b/src/main/java/com/falsepattern/lib/internal/FalsePatternLib.java @@ -14,17 +14,18 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** - * Utility class used by FalsePatternLib's internal code. This can change between versions without notice, so do not use this in your code! + * Utility class used by FalsePatternLib's internal code. This can change between versions without notice, so do not use + * this in your code! */ public class FalsePatternLib extends DummyModContainer { - @Getter - private static final Logger log = LogManager.getLogger(Tags.MODNAME); + @Getter private static final Logger log = LogManager.getLogger(Tags.MODNAME); - @Getter - private static final boolean developerEnvironment = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + @Getter private static final boolean developerEnvironment = + (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); public FalsePatternLib() { - super(MetadataCollection.from(ResourceUtil.getResourceFromJar("/mcmod.info", FalsePatternLib.class), Tags.MODID).getMetadataForId(Tags.MODID, null)); + super(MetadataCollection.from(ResourceUtil.getResourceFromJar("/mcmod.info", FalsePatternLib.class), Tags.MODID) + .getMetadataForId(Tags.MODID, null)); log.info("Version " + Tags.VERSION + " initialized!"); } diff --git a/src/main/java/com/falsepattern/lib/mixin/IMixin.java b/src/main/java/com/falsepattern/lib/mixin/IMixin.java index 6ba6516..6b94bc1 100644 --- a/src/main/java/com/falsepattern/lib/mixin/IMixin.java +++ b/src/main/java/com/falsepattern/lib/mixin/IMixin.java @@ -1,24 +1,29 @@ package com.falsepattern.lib.mixin; import cpw.mods.fml.relauncher.FMLLaunchHandler; -import lombok.val; - import java.util.List; import java.util.function.Predicate; import java.util.function.Supplier; +import lombok.val; public interface IMixin { - Side getSide(); String getMixin(); - Predicate> getFilter(); default boolean shouldLoad(List loadedMods) { val side = getSide(); - return (side == Side.COMMON - || side == Side.SERVER && FMLLaunchHandler.side().isServer() - || side == Side.CLIENT && FMLLaunchHandler.side().isClient()) - && getFilter().test(loadedMods); + return (side == Side.COMMON || side == Side.SERVER && FMLLaunchHandler.side().isServer() || + side == Side.CLIENT && FMLLaunchHandler.side().isClient()) && getFilter().test(loadedMods); + } + + Side getSide(); + + Predicate> getFilter(); + + enum Side { + COMMON, + CLIENT, + SERVER } final class PredicateHelpers { @@ -42,10 +47,4 @@ public interface IMixin { return (list) -> !list.contains(mod); } } - - enum Side { - COMMON, - CLIENT, - SERVER - } } diff --git a/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java b/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java index ff0535d..961f077 100644 --- a/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java +++ b/src/main/java/com/falsepattern/lib/mixin/IMixinPlugin.java @@ -1,14 +1,6 @@ package com.falsepattern.lib.mixin; import com.falsepattern.lib.internal.CoreLoadingPlugin; -import lombok.val; -import net.minecraft.launchwrapper.Launch; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.lib.tree.ClassNode; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.extensibility.IMixinInfo; - import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -18,16 +10,19 @@ import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import lombok.val; +import net.minecraft.launchwrapper.Launch; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.lib.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; import static java.nio.file.Files.walk; public interface IMixinPlugin extends IMixinConfigPlugin { Path MODS_DIRECTORY_PATH = CoreLoadingPlugin.mcDir.toPath().resolve("mods"); - Logger getLogger(); - ITargetedMod[] getTargetedModEnumValues(); - IMixin[] getMixinEnumValues(); - static Logger createLogger(String modName) { return LogManager.getLogger(modName + " Mixin Loader"); } @@ -57,15 +52,13 @@ public interface IMixinPlugin extends IMixinConfigPlugin { val isDevelopmentEnvironment = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); val targetedMods = getTargetedModEnumValues(); val loadedMods = Arrays.stream(targetedMods) - .filter(mod -> (mod.isLoadInDevelopment() && isDevelopmentEnvironment) - || loadJarOf(mod)) + .filter(mod -> (mod.isLoadInDevelopment() && isDevelopmentEnvironment) || loadJarOf(mod)) .collect(Collectors.toList()); for (val mod : targetedMods) { - if(loadedMods.contains(mod)) { + if (loadedMods.contains(mod)) { getLogger().info("Found " + mod.getModName() + "! Integrating now..."); - } - else { + } else { getLogger().info("Could not find " + mod.getModName() + "! Skipping integration...."); } } @@ -81,27 +74,19 @@ public interface IMixinPlugin extends IMixinConfigPlugin { return mixins; } - @Override - default void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } - - @Override - default void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - - } + ITargetedMod[] getTargetedModEnumValues(); default boolean loadJarOf(final ITargetedMod mod) { boolean success = false; try { File jar = findJarOf(mod); - if(jar == null) { + if (jar == null) { getLogger().info("Jar not found for " + mod); return false; } getLogger().info("Attempting to add " + jar + " to the URL Class Path"); success = true; - if(!jar.exists()) { + if (!jar.exists()) { success = false; throw new FileNotFoundException(jar.toString()); } @@ -112,17 +97,26 @@ public interface IMixinPlugin extends IMixinConfigPlugin { return success; } + Logger getLogger(); + + IMixin[] getMixinEnumValues(); + static File findJarOf(final ITargetedMod mod) { try { - return walk(MODS_DIRECTORY_PATH) - .filter(mod::isMatchingJar) - .map(Path::toFile) - .findFirst() - .orElse(null); - } - catch (IOException e) { + return walk(MODS_DIRECTORY_PATH).filter(mod::isMatchingJar).map(Path::toFile).findFirst().orElse(null); + } catch (IOException e) { e.printStackTrace(); return null; } } + + @Override + default void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + default void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } } diff --git a/src/main/java/com/falsepattern/lib/mixin/ITargetedMod.java b/src/main/java/com/falsepattern/lib/mixin/ITargetedMod.java index 472cff3..ea788fa 100644 --- a/src/main/java/com/falsepattern/lib/mixin/ITargetedMod.java +++ b/src/main/java/com/falsepattern/lib/mixin/ITargetedMod.java @@ -1,14 +1,13 @@ package com.falsepattern.lib.mixin; import com.google.common.io.Files; - import java.nio.file.Path; import java.util.function.Predicate; public interface ITargetedMod { String getModName(); - Predicate getCondition(); + boolean isLoadInDevelopment(); default boolean isMatchingJar(Path path) { @@ -19,6 +18,8 @@ public interface ITargetedMod { return "jar".equals(fileExtension) && getCondition().test(nameLowerCase); } + Predicate getCondition(); + final class PredicateHelpers { public static Predicate startsWith(String subString) { return (name) -> name.startsWith(subString); diff --git a/src/main/java/com/falsepattern/lib/mixin/MinecraftURLClassPath.java b/src/main/java/com/falsepattern/lib/mixin/MinecraftURLClassPath.java index 5cbc1e3..343faa2 100644 --- a/src/main/java/com/falsepattern/lib/mixin/MinecraftURLClassPath.java +++ b/src/main/java/com/falsepattern/lib/mixin/MinecraftURLClassPath.java @@ -2,24 +2,23 @@ package com.falsepattern.lib.mixin; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModClassLoader; +import java.io.File; +import java.lang.reflect.Method; +import java.net.URL; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.val; import net.minecraft.launchwrapper.LaunchClassLoader; -import java.io.File; -import java.lang.reflect.Method; -import java.net.URL; - /** * Backport from spongemixins 1.3 for compat with the curseforge 1.2.0 version. - * + *

* Also added Grimoire protection. */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class MinecraftURLClassPath { /** - * Utility to manipulate the minecraft URL ClassPath + * Utility to manipulate the minecraft URL ClassPath */ private static final Object ucp; @@ -65,11 +64,12 @@ public final class MinecraftURLClassPath { } /** - * Adds a Jar to the Minecraft URL ClassPath - * - Needed when using mixins on classes outside of Minecraft or other coremods + * Adds a Jar to the Minecraft URL ClassPath - Needed when using mixins on classes outside of Minecraft or other + * coremods */ public static void addJar(File pathToJar) throws Exception { - if (!GRIMOIRE) + if (!GRIMOIRE) { addURL.invoke(ucp, pathToJar.toURI().toURL()); + } } } diff --git a/src/main/java/com/falsepattern/lib/text/FormattedText.java b/src/main/java/com/falsepattern/lib/text/FormattedText.java index 6c3c343..26a7314 100644 --- a/src/main/java/com/falsepattern/lib/text/FormattedText.java +++ b/src/main/java/com/falsepattern/lib/text/FormattedText.java @@ -3,6 +3,15 @@ package com.falsepattern.lib.text; import com.falsepattern.lib.StableAPI; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import java.awt.Color; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; import lombok.NonNull; import lombok.val; import lombok.var; @@ -19,11 +28,6 @@ import net.minecraft.util.ChatStyle; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; -import java.awt.Color; -import java.lang.reflect.Field; -import java.util.*; -import java.util.function.Consumer; - /** * Universal escape sequence-based text rendering and chat messages. */ @@ -33,35 +37,69 @@ public final class FormattedText { private static final Map colorMap = new HashMap<>(); private static final char ESCAPE = '\u00a7'; + static { - for (val value: EnumChatFormatting.values()) { + for (val value : EnumChatFormatting.values()) { reverseMap.put(value.getFormattingCode(), value); if (value.isColor()) { final int rgb; switch (value.getFormattingCode()) { - default: rgb = 0x000000; break; - case '1': rgb = 0x0000AA; break; - case '2': rgb = 0x00AA00; break; - case '3': rgb = 0x00AAAA; break; - case '4': rgb = 0xAA0000; break; - case '5': rgb = 0xAA00AA; break; - case '6': rgb = 0xFFAA00; break; - case '7': rgb = 0xAAAAAA; break; - case '8': rgb = 0x555555; break; - case '9': rgb = 0x5555FF; break; - case 'a': rgb = 0x55FF55; break; - case 'b': rgb = 0x55FFFF; break; - case 'c': rgb = 0xFF5555; break; - case 'd': rgb = 0xFF55FF; break; - case 'e': rgb = 0xFFFF55; break; - case 'f': rgb = 0xFFFFFF; break; + default: + rgb = 0x000000; + break; + case '1': + rgb = 0x0000AA; + break; + case '2': + rgb = 0x00AA00; + break; + case '3': + rgb = 0x00AAAA; + break; + case '4': + rgb = 0xAA0000; + break; + case '5': + rgb = 0xAA00AA; + break; + case '6': + rgb = 0xFFAA00; + break; + case '7': + rgb = 0xAAAAAA; + break; + case '8': + rgb = 0x555555; + break; + case '9': + rgb = 0x5555FF; + break; + case 'a': + rgb = 0x55FF55; + break; + case 'b': + rgb = 0x55FFFF; + break; + case 'c': + rgb = 0xFF5555; + break; + case 'd': + rgb = 0xFF55FF; + break; + case 'e': + rgb = 0xFFFF55; + break; + case 'f': + rgb = 0xFFFFFF; + break; } colorMap.put(value, new Color(rgb)); } try { Field colorF = Color.class.getDeclaredField(value.getFriendlyName()); - colorMap.put(value, (Color)colorF.get(null)); - } catch (NoSuchFieldException | IllegalAccessException ignored) {} + colorMap.put(value, (Color) colorF.get(null)); + } catch (NoSuchFieldException | IllegalAccessException ignored) { + } } } @@ -74,7 +112,10 @@ public final class FormattedText { private final boolean endLine; - private FormattedText(@NonNull String text, @NonNull EnumChatFormatting colorStyle, @NonNull Set fancyStyles, boolean endLine) { + private FormattedText(@NonNull String text, + @NonNull EnumChatFormatting colorStyle, + @NonNull Set fancyStyles, + boolean endLine) { this.text = text; this.fancyStyles.addAll(fancyStyles); this.colorStyle = colorStyle; @@ -84,7 +125,9 @@ public final class FormattedText { /** * Parse a string with minecraft style escapes (\u00a7X) into a {@link FormattedText} instance, which can then be * used to generate chat or render-able text. + * * @param text The string to parse + * * @return The parsed text structure */ public static FormattedText parse(String text) { @@ -98,8 +141,9 @@ public final class FormattedText { char c = text.charAt(i); if (format) { val f = reverseMap.get(c); - if (f == null) + if (f == null) { continue; + } if (f == EnumChatFormatting.RESET) { currentColorStyle = EnumChatFormatting.WHITE; currentFancyStyle.clear(); @@ -114,10 +158,11 @@ public final class FormattedText { if (c == ESCAPE || c == '\n') { format = c == ESCAPE; val txt = new FormattedText(accumulator.toString(), currentColorStyle, currentFancyStyle, c == '\n'); - if (result == null) + if (result == null) { result = txt; - else + } else { result.siblings.add(txt); + } accumulator.setLength(0); continue; } @@ -125,16 +170,29 @@ public final class FormattedText { } if (accumulator.length() > 0) { val txt = new FormattedText(accumulator.toString(), currentColorStyle, currentFancyStyle, true); - if (result == null) + if (result == null) { result = txt; - else + } else { result.siblings.add(txt); + } } return result; } + public void addChatMessage(ICommandSender target) { + addChatMessage(target::addChatMessage); + } + + private void addChatMessage(Consumer consumer) { + for (val line : toChatText()) { + consumer.accept(line); + } + } + /** - * Converts this text structure into chat components that can be sent to the client. This is a list, because chat components can't have newlines. + * Converts this text structure into chat components that can be sent to the client. This is a list, because chat + * components can't have newlines. + * * @return The chat component. */ public List toChatText() { @@ -142,7 +200,7 @@ public final class FormattedText { val result = new ArrayList(); result.add(thisComponent); FormattedText prevSibling = this; - for (val sibling: siblings) { + for (val sibling : siblings) { val siblingResult = sibling.toChatTextSingle(); if (prevSibling.endLine) { result.add(thisComponent = siblingResult); @@ -160,7 +218,7 @@ public final class FormattedText { if (colorStyle != null) { style.setColor(colorStyle); } - for (val fancyStyle: fancyStyles) { + for (val fancyStyle : fancyStyles) { switch (fancyStyle) { case OBFUSCATED: style.setObfuscated(true); @@ -183,16 +241,6 @@ public final class FormattedText { return thisComponent; } - private void addChatMessage(Consumer consumer) { - for (val line: toChatText()) { - consumer.accept(line); - } - } - - public void addChatMessage(ICommandSender target) { - addChatMessage(target::addChatMessage); - } - @SideOnly(Side.CLIENT) public void addChatMessage(EntityOtherPlayerMP target) { addChatMessage(target::addChatMessage); @@ -221,33 +269,23 @@ public final class FormattedText { /** * {@link #draw(FontRenderer, int, int, boolean)} without drop shadows. + * * @param renderer The font renderer to use - * @param x Left side - * @param y Top side + * @param x Left side + * @param y Top side */ @SideOnly(Side.CLIENT) public void draw(FontRenderer renderer, int x, int y) { draw(renderer, x, y, false); } - - /** - * {@link #draw(FontRenderer, int, int, boolean)} with drop shadows. - * @param renderer The font renderer to use - * @param x Left side - * @param y Top side - */ - @SideOnly(Side.CLIENT) - public void drawWithShadow(FontRenderer renderer, int x, int y) { - draw(renderer, x, y, true); - } - /** * Renders this structure as GUI text. + * * @param renderer The font renderer to use - * @param x Left side - * @param y Top side - * @param shadow Whether to have drop shadow under the text + * @param x Left side + * @param y Top side + * @param shadow Whether to have drop shadow under the text */ @SideOnly(Side.CLIENT) public void draw(FontRenderer renderer, int x, int y, boolean shadow) { @@ -257,7 +295,7 @@ public final class FormattedText { y += renderer.FONT_HEIGHT; x = startX; } - for (val sibling: siblings) { + for (val sibling : siblings) { x = renderer.drawString(sibling.text, x, y, colorMap.get(sibling.colorStyle).getRGB(), shadow); if (sibling.endLine) { y += renderer.FONT_HEIGHT; @@ -265,4 +303,16 @@ public final class FormattedText { } } } + + /** + * {@link #draw(FontRenderer, int, int, boolean)} with drop shadows. + * + * @param renderer The font renderer to use + * @param x Left side + * @param y Top side + */ + @SideOnly(Side.CLIENT) + public void drawWithShadow(FontRenderer renderer, int x, int y) { + draw(renderer, x, y, true); + } } diff --git a/src/main/java/com/falsepattern/lib/util/ResourceUtil.java b/src/main/java/com/falsepattern/lib/util/ResourceUtil.java index daadca4..d85e571 100644 --- a/src/main/java/com/falsepattern/lib/util/ResourceUtil.java +++ b/src/main/java/com/falsepattern/lib/util/ResourceUtil.java @@ -1,8 +1,6 @@ package com.falsepattern.lib.util; import com.falsepattern.lib.StableAPI; -import lombok.val; - import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -10,6 +8,7 @@ import java.io.InputStream; import java.net.URL; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import lombok.val; /** * A utility class for reading resources in many ways. @@ -18,10 +17,14 @@ import java.nio.charset.StandardCharsets; public class ResourceUtil { /** - * Reads a resource as a string, using the {@link StandardCharsets#UTF_8} charset, from a specific jar file. See {@link #getResourceFromJar(String, Class)}. - * @param resourcePath The resource to read + * Reads a resource as a string, using the {@link StandardCharsets#UTF_8} charset, from a specific jar file. See + * {@link #getResourceFromJar(String, Class)}. + * + * @param resourcePath The resource to read * @param referenceClass The class, from whose jar to get the resource from + * * @return The string from the resource + * * @throws IOException From {@link #readBytes(InputStream)} */ public static String getResourceStringFromJar(String resourcePath, Class referenceClass) throws IOException { @@ -31,59 +34,34 @@ public class ResourceUtil { /** * Reads a resource as a string from a specific jar file. See {@link #getResourceFromJar(String, Class)}. - * @param resourcePath The resource to read + * + * @param resourcePath The resource to read * @param referenceClass The class, from whose jar to get the resource from - * @param charset The charset to decode the raw bytes with + * @param charset The charset to decode the raw bytes with + * * @return The string from the resource + * * @throws IOException From {@link #readBytes(InputStream)} */ - public static String getResourceStringFromJar(String resourcePath, Class referenceClass, Charset charset) throws IOException { + public static String getResourceStringFromJar(String resourcePath, Class referenceClass, Charset charset) + throws IOException { return new String(getResourceBytesFromJar(resourcePath, referenceClass), charset); } - - /** - * Reads a resource as a string, using the {@link StandardCharsets#UTF_8} charset. - * @param resourcePath The resource to read - * @return The string from the resource - * @throws IOException From {@link #readBytes(InputStream)} - */ - public static String getResourceString(String resourcePath) throws IOException { - return getResourceString(resourcePath, StandardCharsets.UTF_8); - } - - /** - * Reads a resource as a string. - * @param resourcePath The resource to read - * @param charset The charset to decode the raw bytes with - * @return The string from the resource - * @throws IOException From {@link #readBytes(InputStream)} - */ - public static String getResourceString(String resourcePath, Charset charset) throws IOException { - return new String(getResourceBytes(resourcePath), charset); - } - /** * Reads the raw bytes of a resource in a specific jar file. See {@link #getResourceFromJar(String, Class)}. - * @param resourcePath The resource to read + * + * @param resourcePath The resource to read * @param referenceClass The class, from whose jar to get the resource from + * * @return The bytes of the resource + * * @throws IOException From {@link #readBytes(InputStream)} */ public static byte[] getResourceBytesFromJar(String resourcePath, Class referenceClass) throws IOException { return readBytesSafe(getResourceFromJar(resourcePath, referenceClass), resourcePath); } - /** - * Reads the raw bytes of a resource. - * @param resourcePath The resource to read - * @return The bytes of the resource - * @throws IOException From {@link #readBytes(InputStream)} - */ - public static byte[] getResourceBytes(String resourcePath) throws IOException { - return readBytesSafe(ResourceUtil.class.getResourceAsStream(resourcePath), resourcePath); - } - private static byte[] readBytesSafe(InputStream stream, String resourcePath) throws IOException { if (stream == null) { throw new FileNotFoundException("Could not find resource at " + resourcePath); @@ -91,10 +69,50 @@ public class ResourceUtil { return readBytes(stream); } + /** + * Retrieves a resource from the jar file of a specific class. Falls back to + * {@link Class#getResourceAsStream(String)} if the resource is not found in the jar, or the class is not from a jar + * file. + * + * @param resourcePath The resource to retrieve + * @param referenceClass The class, from whose jar to get the resource from + * + * @return The resource, or null if it was not found. + */ + public static InputStream getResourceFromJar(String resourcePath, Class referenceClass) { + URL classFile = referenceClass.getResource('/' + referenceClass.getName().replace('.', '/') + ".class"); + lookup: + { + if (classFile == null) { + break lookup; + } + String file = classFile.getFile(); + int id = file.indexOf("!"); + if (!classFile.getProtocol().equals("jar") || id < 0) { + break lookup; + } + //Loading from a jar + try { + URL resource = new URL("jar:" + file.substring(0, id) + "!" + resourcePath); + return resource.openStream(); + } catch (IOException e) { + System.err.println("Failed to load resource " + resourcePath + " from jar " + file.substring(0, id)); + e.printStackTrace(); + } + } + //Fallback logic + System.out.println("Using fallback resource loading logic for " + resourcePath + " with reference to " + + referenceClass.getName()); + return referenceClass.getResourceAsStream(resourcePath); + } + /** * Fully reads a stream into a byte array. + * * @param stream The stream to read + * * @return The data from the stream + * * @throws IOException From {@link InputStream#read(byte[])} */ public static byte[] readBytes(InputStream stream) throws IOException { @@ -108,34 +126,42 @@ public class ResourceUtil { } /** - * Retrieves a resource from the jar file of a specific class. - * Falls back to {@link Class#getResourceAsStream(String)} if the resource is not found in the jar, or the class is - * not from a jar file. - * @param resourcePath The resource to retrieve - * @param referenceClass The class, from whose jar to get the resource from - * @return The resource, or null if it was not found. + * Reads a resource as a string, using the {@link StandardCharsets#UTF_8} charset. + * + * @param resourcePath The resource to read + * + * @return The string from the resource + * + * @throws IOException From {@link #readBytes(InputStream)} */ - public static InputStream getResourceFromJar(String resourcePath, Class referenceClass) { - URL classFile = referenceClass.getResource('/' + referenceClass.getName().replace('.', '/') + ".class"); - lookup: - { - if (classFile == null) - break lookup; - String file = classFile.getFile(); - int id = file.indexOf("!"); - if (!classFile.getProtocol().equals("jar") || id < 0) - break lookup; - //Loading from a jar - try { - URL resource = new URL("jar:" + file.substring(0, id) + "!" + resourcePath); - return resource.openStream(); - } catch (IOException e) { - System.err.println("Failed to load resource " + resourcePath + " from jar " + file.substring(0, id)); - e.printStackTrace(); - } - } - //Fallback logic - System.out.println("Using fallback resource loading logic for " + resourcePath + " with reference to " + referenceClass.getName()); - return referenceClass.getResourceAsStream(resourcePath); + public static String getResourceString(String resourcePath) throws IOException { + return getResourceString(resourcePath, StandardCharsets.UTF_8); + } + + /** + * Reads a resource as a string. + * + * @param resourcePath The resource to read + * @param charset The charset to decode the raw bytes with + * + * @return The string from the resource + * + * @throws IOException From {@link #readBytes(InputStream)} + */ + public static String getResourceString(String resourcePath, Charset charset) throws IOException { + return new String(getResourceBytes(resourcePath), charset); + } + + /** + * Reads the raw bytes of a resource. + * + * @param resourcePath The resource to read + * + * @return The bytes of the resource + * + * @throws IOException From {@link #readBytes(InputStream)} + */ + public static byte[] getResourceBytes(String resourcePath) throws IOException { + return readBytesSafe(ResourceUtil.class.getResourceAsStream(resourcePath), resourcePath); } }