This commit is contained in:
Paul Reilly 2023-06-09 21:11:36 -05:00
parent f459842eaf
commit bacf6e8818
58 changed files with 565 additions and 668 deletions

View File

@ -34,7 +34,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
@Info(name = "cage", description = "Cage a player.",
usage = "/cage <player> <on|off> [material]")
usage = "/cage <player> <on|off> [material]")
@Permissive(perm = "datura.cage")
public class CageCommand extends Commander
{
@ -68,7 +68,7 @@ public class CageCommand extends Commander
@Completion(args = {"[material]"}, index = 2)
@Subcommand(permission = "datura.cage.custom", args = {Player.class, String.class, Material.class})
public void cagePlayer(final CommandSender sender, final Player player, final String string,
final Material material)
final Material material)
{
switch (string.toLowerCase())
{

View File

@ -11,7 +11,7 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@Info(name = "locker", description = "Lock a player, preventing them from interacting with their game client.",
usage = "/locker <player> <on|off>", aliases = {"lock", "lockup"})
usage = "/locker <player> <on|off>", aliases = {"lock", "lockup"})
@Permissive(perm = "datura.locker")
public final class LockerCommand extends Commander
{

View File

@ -6,33 +6,33 @@ import me.totalfreedom.security.NodeType;
public class DefaultNodes
{
public static final Node OP = new PermissionNodeBuilder()
.key("freedom.master_key")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(true)
.build();
.key("freedom.master_key")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(true)
.build();
public static final Node NON_OP = new PermissionNodeBuilder()
.key("freedom.default")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(false)
.build();
.key("freedom.default")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(false)
.build();
public static final Node ALL = new PermissionNodeBuilder()
.key("*")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(true)
.build();
.key("*")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(true)
.build();
public static final Node NONE = new PermissionNodeBuilder()
.key("freedom.none")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(false)
.build();
.key("freedom.none")
.value(true)
.type(NodeType.PERMISSION)
.negated(false)
.wildcard(false)
.build();
private DefaultNodes()
{

View File

@ -28,11 +28,11 @@ public class FreedomGroup implements Group
private final PermissionAttachment attachment;
public FreedomGroup(final Component name,
final Component prefix,
final Component abbreviation,
final int weight,
final boolean isDefault,
final boolean isHidden)
final Component prefix,
final Component abbreviation,
final int weight,
final boolean isDefault,
final boolean isHidden)
{
this.name = name;
this.prefix = prefix;
@ -121,11 +121,11 @@ public class FreedomGroup implements Group
public boolean isPermissionSet(@NotNull final Permission perm)
{
final Node node = permissions()
.stream()
.filter(n -> n.bukkit()
.equals(perm))
.findFirst()
.orElse(null);
.stream()
.filter(n -> n.bukkit()
.equals(perm))
.findFirst()
.orElse(null);
return node != null && node.value();
}
@ -146,30 +146,29 @@ public class FreedomGroup implements Group
public boolean hasPermission(@NotNull final Permission perm)
{
final Node node = permissions()
.stream()
.filter(n -> n.bukkit()
.equals(perm))
.findFirst()
.orElse(null);
.stream()
.filter(n -> n.bukkit()
.equals(perm))
.findFirst()
.orElse(null);
return node != null && node.value();
}
/**
* Adds a permission to the relative PermissionAttachment for this group.
* This method is not thread-safe and should not be called asynchronously.
* Adds a permission to the relative PermissionAttachment for this group. This method is not thread-safe and should
* not be called asynchronously.
* <p>
* This method is only here for compatibility with the Bukkit API.
*
* @param plugin The plugin responsible for this attachment. May not be null
* or disabled.
* @param plugin The plugin responsible for this attachment. May not be null or disabled.
* @param name Name of the permission to attach
* @param value Value of the permission
* @return This group's PermissionAttachment.
*/
@Override
public @NotNull PermissionAttachment addAttachment(@NotNull final Plugin plugin, @NotNull final String name,
final boolean value)
final boolean value)
{
attachment.setPermission(name, value);
return attachment;
@ -183,7 +182,7 @@ public class FreedomGroup implements Group
@Override
public @Nullable PermissionAttachment addAttachment(@NotNull final Plugin plugin, @NotNull final String name,
final boolean value, final int ticks)
final boolean value, final int ticks)
{
attachment.setPermission(name, value);
return attachment;
@ -211,23 +210,23 @@ public class FreedomGroup implements Group
public @NotNull Set<PermissionAttachmentInfo> getEffectivePermissions()
{
return permissions()
.stream()
.map(n -> new PermissionAttachmentInfo(
this,
n.key(),
attachment,
n.value()))
.collect(Collectors.toSet());
.stream()
.map(n -> new PermissionAttachmentInfo(
this,
n.key(),
attachment,
n.value()))
.collect(Collectors.toSet());
}
@Override
public boolean isOp()
{
final Node node = permissions()
.stream()
.filter(n -> n.equals(DefaultNodes.OP))
.findFirst()
.orElse(null);
.stream()
.filter(n -> n.equals(DefaultNodes.OP))
.findFirst()
.orElse(null);
return node != null && node.value();
}

View File

@ -23,9 +23,9 @@ import java.util.Set;
import java.util.UUID;
/**
* The superinterface User extends PermissionHolder,
* which is an extension of {@link org.bukkit.permissions.Permissible}.
* This means that our permission data can be interchanged with other permission plugins.
* The superinterface User extends PermissionHolder, which is an extension of
* {@link org.bukkit.permissions.Permissible}. This means that our permission data can be interchanged with other
* permission plugins.
*/
public class FreedomUser implements User
{
@ -139,7 +139,7 @@ public class FreedomUser implements User
@Override
public @NotNull PermissionAttachment addAttachment(@NotNull final Plugin plugin, @NotNull final String name,
final boolean value)
final boolean value)
{
final Player player = Bukkit.getPlayer(uuid);
if (player != null)
@ -164,7 +164,7 @@ public class FreedomUser implements User
@Override
public @Nullable PermissionAttachment addAttachment(@NotNull final Plugin plugin, @NotNull final String name,
final boolean value, final int ticks)
final boolean value, final int ticks)
{
final Player player = Bukkit.getPlayer(uuid);
if (player != null)

View File

@ -16,9 +16,9 @@ record PermissionNode(String key,
public Permission bukkit()
{
return new Permission(key(),
value()
? PermissionDefault.TRUE
: PermissionDefault.FALSE);
value()
? PermissionDefault.TRUE
: PermissionDefault.FALSE);
}
@Override
@ -26,8 +26,8 @@ record PermissionNode(String key,
{
return node.key()
.equalsIgnoreCase(key())
&& node.value() == value()
&& node.type() == type();
&& node.value() == value()
&& node.type() == type();
}
@Override

View File

@ -51,10 +51,9 @@ public class Cager extends Service
}
/**
* This method generates a cube centered around the passed location,
* made of the provided material. This method returns the passed location object.
* We use the {@link ShapeUtils} class to generate the cube, which allows us to define
* custom shapes using {@link DoubleUnaryOperator}s.
* This method generates a cube centered around the passed location, made of the provided material. This method
* returns the passed location object. We use the {@link ShapeUtils} class to generate the cube, which allows us to
* define custom shapes using {@link DoubleUnaryOperator}s.
*
* @param location The location to center the cube around.
* @param material The material to use for the cube.
@ -108,8 +107,7 @@ public class Cager extends Service
}
/**
* This method will check to make sure each caged player remains within their cage.
* We use
* This method will check to make sure each caged player remains within their cage. We use
* <p>
* <code>{@link Location#distanceSquared(Location)} * {@link Math#pow(double, double)}</code>
* <p>

View File

@ -81,9 +81,9 @@ public class Locker extends Service
final SplittableRandom random = new SplittableRandom();
player.getEyeLocation()
.add(new Vector(
random.nextDouble(-1.0, 1.0),
random.nextDouble(-1.0, 1.0),
random.nextDouble(-1.0, 1.0)
random.nextDouble(-1.0, 1.0),
random.nextDouble(-1.0, 1.0),
random.nextDouble(-1.0, 1.0)
));
}
}

View File

@ -29,8 +29,7 @@ public class MySQL implements SQL
}
/**
* Adds credentials to the MySQL URL.
* If the URL already contains credentials, they will be overwritten.
* Adds credentials to the MySQL URL. If the URL already contains credentials, they will be overwritten.
*
* @param username The username to add
* @param password The password to add
@ -61,25 +60,24 @@ public class MySQL implements SQL
public CompletableFuture<PreparedStatement> prepareStatement(final String query, final Object... args)
{
return getConnection()
.thenApplyAsync(connection ->
{
try
{
final PreparedStatement statement = connection.prepareStatement(query);
for (int i = 0; i < args.length; i++)
{
statement.setObject(i + 1, args[i]);
}
return statement;
}
catch (SQLException ex)
{
throw new CompletionException("Failed to prepare statement: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
.thenApplyAsync(connection ->
{
try
{
final PreparedStatement statement = connection.prepareStatement(query);
for (int i = 0; i < args.length; i++)
{
statement.setObject(i + 1, args[i]);
}
return statement;
} catch (SQLException ex)
{
throw new CompletionException("Failed to prepare statement: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
}
private CompletableFuture<Connection> getConnection()
@ -89,11 +87,10 @@ public class MySQL implements SQL
try
{
return DriverManager.getConnection(url.toString());
}
catch (SQLException ex)
} catch (SQLException ex)
{
throw new CompletionException("Failed to connect to the database: "
+ url.toString() + "\n", ex);
+ url.toString() + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
@ -104,61 +101,58 @@ public class MySQL implements SQL
public CompletableFuture<ResultSet> executeQuery(final String query, final Object... args)
{
return prepareStatement(query, args)
.thenApplyAsync(statement ->
{
try
{
return statement.executeQuery();
}
catch (SQLException ex)
{
throw new CompletionException(
"Failed to retrieve a result set from query: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
.thenApplyAsync(statement ->
{
try
{
return statement.executeQuery();
} catch (SQLException ex)
{
throw new CompletionException(
"Failed to retrieve a result set from query: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
}
@Override
public CompletableFuture<Integer> executeUpdate(final String query, final Object... args)
{
return prepareStatement(query, args)
.thenApplyAsync(statement ->
{
try
{
return statement.executeUpdate();
}
catch (SQLException ex)
{
throw new CompletionException("Failed to execute update: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
.thenApplyAsync(statement ->
{
try
{
return statement.executeUpdate();
} catch (SQLException ex)
{
throw new CompletionException("Failed to execute update: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
}
@Override
public CompletableFuture<Boolean> execute(final String query, final Object... args)
{
return prepareStatement(query, args)
.thenApplyAsync(statement ->
{
try
{
return statement.execute();
}
catch (SQLException ex)
{
throw new CompletionException("Failed to execute statement: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
.thenApplyAsync(statement ->
{
try
{
return statement.execute();
} catch (SQLException ex)
{
throw new CompletionException("Failed to execute statement: "
+ query + "\n", ex);
}
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
}
@Override
@ -181,46 +175,45 @@ public class MySQL implements SQL
}
public <T> CompletableFuture<T> getColumn(final String table, final String column, final String key,
final Identity identity, final Class<T> type)
final Identity identity, final Class<T> type)
{
return executeQuery("SELECT ? FROM ? WHERE ? = ?", column, table, key, identity.getId())
.thenApplyAsync(resultSet ->
{
try
{
if (resultSet.next())
{
return resultSet.getObject(column, type);
}
}
catch (SQLException ex)
{
throw new CompletionException(
"Failed to retrieve column: " + column + " from table: " + table + " " +
"where primary key: " + key + " is equal to: " + identity.getId() + "\n",
ex);
}
return null;
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
.thenApplyAsync(resultSet ->
{
try
{
if (resultSet.next())
{
return resultSet.getObject(column, type);
}
} catch (SQLException ex)
{
throw new CompletionException(
"Failed to retrieve column: " + column + " from table: " + table + " " +
"where primary key: " + key + " is equal to: " + identity.getId() + "\n",
ex);
}
return null;
}, CommonsBase.getInstance()
.getExecutor()
.getAsync());
}
public CompletableFuture<Boolean> updateColumn(final String table, final String column, final Object value,
final String key, final Identity identity)
final String key, final Identity identity)
{
return executeUpdate("UPDATE ? SET ? = ? WHERE ? = ?", table, column, value, key, identity.getId())
.thenApplyAsync(result -> result > 0, CommonsBase.getInstance()
.getExecutor()
.getAsync());
.thenApplyAsync(result -> result > 0, CommonsBase.getInstance()
.getExecutor()
.getAsync());
}
public CompletableFuture<Boolean> deleteRow(final String table, final String key, final Identity identity)
{
return executeUpdate("DELETE FROM ? WHERE ? = ?", table, key, identity.getId())
.thenApplyAsync(result -> result > 0, CommonsBase.getInstance()
.getExecutor()
.getAsync());
.thenApplyAsync(result -> result > 0, CommonsBase.getInstance()
.getExecutor()
.getAsync());
}
public CompletableFuture<Boolean> insertRow(final String table, final Object... values)

View File

@ -7,18 +7,16 @@ import me.totalfreedom.economy.EconomicEntityData;
* Represents the server's economy holder.
* <br>
* <br>
* This is effectively a Bank object which is meant to represent the server itself,
* which can store a balance and perform transactions with other EconomicEntity objects.
* This is effectively a Bank object which is meant to represent the server itself, which can store a balance and
* perform transactions with other EconomicEntity objects.
* <br>
* <br>
* The server is initially given a maximum balance of {@link Long#MAX_VALUE}, though this can be changed
* using the constructor {@link #ServerEconomyHolder(String, long)}. The value that this
* bank object holds is persistent, which means that the total economic resources available
* are of limited supply.
* The server is initially given a maximum balance of {@link Long#MAX_VALUE}, though this can be changed using the
* constructor {@link #ServerEconomyHolder(String, long)}. The value that this bank object holds is persistent, which
* means that the total economic resources available are of limited supply.
* <br>
* <br>
* Please be aware, if the server's economy falls below 0,
* it will have drastic consequences.
* Please be aware, if the server's economy falls below 0, it will have drastic consequences.
*/
public class ServerEconomyHolder implements EconomicEntity, EconomicEntityData
{
@ -49,9 +47,9 @@ public class ServerEconomyHolder implements EconomicEntity, EconomicEntityData
}
/**
* This method will return this object, as it is both the EconomicEntity and the EconomicEntityData.
* This is due to the fact that the server should only ever have one singular concrete representation
* of it's economic entity and the respective data.
* This method will return this object, as it is both the EconomicEntity and the EconomicEntityData. This is due to
* the fact that the server should only ever have one singular concrete representation of it's economic entity and
* the respective data.
*
* @return this object.
*/
@ -71,8 +69,7 @@ public class ServerEconomyHolder implements EconomicEntity, EconomicEntityData
}
/**
* This method will always return false, as the server should not ever be
* prevented from performing transactions.
* This method will always return false, as the server should not ever be prevented from performing transactions.
*
* @return false
*/
@ -103,8 +100,7 @@ public class ServerEconomyHolder implements EconomicEntity, EconomicEntityData
}
/**
* Adds the specified amount to the server's balance.
* This method mutates the balance and returns the new balance.
* Adds the specified amount to the server's balance. This method mutates the balance and returns the new balance.
*
* @param amount The amount to add.
* @return The new balance.
@ -117,8 +113,8 @@ public class ServerEconomyHolder implements EconomicEntity, EconomicEntityData
}
/**
* Removes the specified amount from the server's balance.
* This method mutates the balance and returns the new balance.
* Removes the specified amount from the server's balance. This method mutates the balance and returns the new
* balance.
*
* @param amount The amount to remove.
* @return The new balance.

View File

@ -42,14 +42,14 @@ public class SimpleUserData implements UserData
}
private SimpleUserData(
final UUID uuid,
final String username,
final User user,
final Group group,
final long playtime,
final boolean canInteract,
final long balance,
final boolean transactionsFrozen)
final UUID uuid,
final String username,
final User user,
final Group group,
final long playtime,
final boolean canInteract,
final long balance,
final boolean transactionsFrozen)
{
this.uuid = uuid;
this.username = username;
@ -66,57 +66,56 @@ public class SimpleUserData implements UserData
return sql.executeQuery("SELECT * FROM users WHERE UUID = ?", uuid)
.thenApplyAsync(result ->
{
try
{
if (result.next())
{
final String g = result.getString("group");
try
{
if (result.next())
{
final String g = result.getString("group");
final UUID u = UUID.fromString(uuid);
final String username = result.getString("username");
final UUID u = UUID.fromString(uuid);
final String username = result.getString("username");
final Player player = Bukkit.getPlayer(u);
final Player player = Bukkit.getPlayer(u);
if (player == null)
throw new IllegalStateException("Player should be online but they are not!");
if (player == null)
throw new IllegalStateException("Player should be online but they are not!");
final User user = new FreedomUser(player);
final Group group = CommonsBase.getInstance()
.getRegistrations()
.getGroupRegistry()
.getGroup(g);
final User user = new FreedomUser(player);
final Group group = CommonsBase.getInstance()
.getRegistrations()
.getGroupRegistry()
.getGroup(g);
final long playtime = result.getLong("playtime");
final boolean canInteract = result.getBoolean("canInteract");
final long balance = result.getLong("balance");
final boolean transactionsFrozen = result.getBoolean("transactionsFrozen");
return new SimpleUserData(u, username, user, group, playtime,
canInteract, balance, transactionsFrozen);
}
}
catch (SQLException ex)
{
final String sb = "An error occurred while trying to retrieve user data for" +
" UUID " +
uuid +
" from the database." +
"\nCaused by: " +
ExceptionUtils.getRootCauseMessage(ex) +
"\nStack trace: " +
ExceptionUtils.getStackTrace(ex);
final long playtime = result.getLong("playtime");
final boolean canInteract = result.getBoolean("canInteract");
final long balance = result.getLong("balance");
final boolean transactionsFrozen = result.getBoolean("transactionsFrozen");
FreedomLogger.getLogger("Datura")
.error(sb);
}
return new SimpleUserData(u, username, user, group, playtime,
canInteract, balance, transactionsFrozen);
}
} catch (SQLException ex)
{
final String sb = "An error occurred while trying to retrieve user data for" +
" UUID " +
uuid +
" from the database." +
"\nCaused by: " +
ExceptionUtils.getRootCauseMessage(ex) +
"\nStack trace: " +
ExceptionUtils.getStackTrace(ex);
final Player player = Bukkit.getPlayer(UUID.fromString(uuid));
if (player == null) throw new IllegalStateException("Player should be online but they are not!");
return new SimpleUserData(player);
}, CommonsBase.getInstance()
.getExecutor()
.getAsync())
FreedomLogger.getLogger("Datura")
.error(sb);
}
final Player player = Bukkit.getPlayer(UUID.fromString(uuid));
if (player == null) throw new IllegalStateException("Player should be online but they are not!");
return new SimpleUserData(player);
}, CommonsBase.getInstance()
.getExecutor()
.getAsync())
.join();
}

View File

@ -20,6 +20,6 @@ public class Fossil extends JavaPlugin
registration.getServiceTaskRegistry()
.registerService(
SubscriptionProvider.syncService(this, trailer));
SubscriptionProvider.syncService(this, trailer));
}
}

View File

@ -32,17 +32,18 @@ public class PadHolder implements Listener
*/
public PadHolder()
{
Bukkit.getPluginManager().registerEvents(this, CommonsBase
.getInstance()
.getRegistrations()
.getModuleRegistry()
.getProvider(Fossil.class)
.getModule());
Bukkit.getPluginManager()
.registerEvents(this, CommonsBase
.getInstance()
.getRegistrations()
.getModuleRegistry()
.getProvider(Fossil.class)
.getModule());
}
/**
* Adds a pad for the given player. If the player already has a pad stored in the map,
* it will be overwritten with the new pad.
* Adds a pad for the given player. If the player already has a pad stored in the map, it will be overwritten with
* the new pad.
*
* @param player The player to add the pad for.
* @param pad The pad to add.
@ -63,8 +64,8 @@ public class PadHolder implements Listener
}
/**
* Gets the pad for the given player, if the player has one.
* If the player has no active pad, this will return null.
* Gets the pad for the given player, if the player has one. If the player has no active pad, this will return
* null.
*
* @param player The player to get the pad for.
* @return The pad for the given player.
@ -98,8 +99,8 @@ public class PadHolder implements Listener
/**
* Handles player pad interaction. This will check the relative block for each acceptible direction, and pass the
* resulting block face (if any) to the bounce pad. See {@link BouncyPad#bouncePad(Player, org.bukkit.block.BlockFace)}
* for how the resulting block face is processed.
* resulting block face (if any) to the bounce pad. See
* {@link BouncyPad#bouncePad(Player, org.bukkit.block.BlockFace)} for how the resulting block face is processed.
*
* @param event The event which gets called when a player moves.
*/
@ -122,10 +123,10 @@ public class PadHolder implements Listener
final Block yNeg1 = getRelative(location, 0, -1, 0);
Stream.of(xNeg1, xPos1, zNeg1, zPos1, yNeg1)
.filter(this::isWool)
.map(block -> block.getFace(location.getBlock()))
.findFirst()
.ifPresent(face -> pad.bouncePad(player, face));
.filter(this::isWool)
.map(block -> block.getFace(location.getBlock()))
.findFirst()
.ifPresent(face -> pad.bouncePad(player, face));
}
/**
@ -139,7 +140,8 @@ public class PadHolder implements Listener
*/
private Block getRelative(final Location location, final int x, final int y, final int z)
{
return location.getBlock().getRelative(x, y, z);
return location.getBlock()
.getRelative(x, y, z);
}
/**

View File

@ -12,8 +12,8 @@ public enum PadType
*/
NORMAL,
/**
* A pad which will bounce the player on {@link BlockFace#NORTH}, {@link BlockFace#SOUTH}, {@link BlockFace#EAST}
* or {@link BlockFace#WEST}.
* A pad which will bounce the player on {@link BlockFace#NORTH}, {@link BlockFace#SOUTH}, {@link BlockFace#EAST} or
* {@link BlockFace#WEST}.
*/
SIDES,
/**

View File

@ -47,8 +47,8 @@ public class CakeCommand extends Commander
public void broadcastCake(final CommandSender sender)
{
Bukkit.broadcast(FreedomMiniMessage.deserialize(true,
"<rainbow>But there's no sense crying over every mistake. You just keep on trying till you run out of " +
"cake.</rainbow>"));
"<rainbow>But there's no sense crying over every mistake. You just keep on trying till you run out of " +
"cake.</rainbow>"));
final ItemStack stack = new ItemStack(Material.CAKE, 1);
final ItemMeta meta = stack.getItemMeta();

View File

@ -8,11 +8,11 @@ public class SimpleTransactionResult implements TransactionResult
{
public static final TransactionResult SUCCESSFUL = new SimpleTransactionResult("Successful transaction.", true);
public static final TransactionResult UNAUTHORIZED = new SimpleTransactionResult("Unauthorized transaction.",
false);
false);
public static final TransactionResult AMOUNT_TOO_SMALL = new SimpleTransactionResult(
"Transaction balance too small.", false);
"Transaction balance too small.", false);
public static final TransactionResult INSUFFICIENT_FUNDS = new SimpleTransactionResult(
"The source has an insufficient balance to carry out this transaction.", false);
"The source has an insufficient balance to carry out this transaction.", false);
private final String message;
private final Component component;
private final boolean successful;
@ -20,8 +20,8 @@ public class SimpleTransactionResult implements TransactionResult
public SimpleTransactionResult(final String message, final boolean successful)
{
this(message, Component.text(message, successful
? NamedTextColor.GREEN
: NamedTextColor.RED), successful);
? NamedTextColor.GREEN
: NamedTextColor.RED), successful);
}
public SimpleTransactionResult(final String message, final Component component, final boolean successful)

View File

@ -38,18 +38,21 @@ public final class CopyCatReaction extends Reaction
@Override
public void display(final Audience audience)
{
final BossBar bossBar = BossBarDisplay.builder().setName(getRandomCharacterString())
.setProgress(0.0F)
.build();
final BossBar bossBar = BossBarDisplay.builder()
.setName(getRandomCharacterString())
.setProgress(0.0F)
.build();
}
public String getRandomCharacterString() {
public String getRandomCharacterString()
{
final SplittableRandom random = new SplittableRandom();
final StringBuilder sb = new StringBuilder(10);
final String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < 10; i++) {
for (int i = 0; i < 10; i++)
{
sb.append(chars.charAt(random.nextInt(chars.length())));
}

View File

@ -24,6 +24,6 @@ public final class FlameTrail extends SimpleTrail
final Vector direction = location.getDirection();
location.getWorld()
.spawnParticle(getTrailType().getType(), location, 0, direction.getX(), direction.getY(),
direction.getZ(), 0.1);
direction.getZ(), 0.1);
}
}

View File

@ -1,17 +1,15 @@
package me.totalfreedom.api;
/**
* This interface represents a Serializable object.
* Objects which require custom serialization and cannot simply override or call
* the default {@link Object#toString()} method should implement this interface.
* This interface represents a Serializable object. Objects which require custom serialization and cannot simply
* override or call the default {@link Object#toString()} method should implement this interface.
*
* @param <T> The type of object to serialize
*/
public interface Serializable<T>
{
/**
* Serialize an object to a string.
* Ideally, this should serialize to an SQL query for easy data transfer.
* Serialize an object to a string. Ideally, this should serialize to an SQL query for easy data transfer.
*
* @param object The object to serialize
* @return The serialized object
@ -20,6 +18,7 @@ public interface Serializable<T>
/**
* Deserialize an object from a Serialized string..
*
* @param serializedObject The serialized object
* @return The deserialized object
*/

View File

@ -25,8 +25,8 @@ public class CommonsBase extends JavaPlugin
private final FreedomExecutor executor = new FreedomExecutor();
/**
* Provides this plugin instance through a safe static method.
* This is effectively the same thing as using {@link JavaPlugin#getPlugin(Class)}
* Provides this plugin instance through a safe static method. This is effectively the same thing as using
* {@link JavaPlugin#getPlugin(Class)}
*
* @return the plugin instance
*/

View File

@ -10,9 +10,9 @@ import me.totalfreedom.data.UserRegistry;
/**
* This class is a holder for each registry in the data package.
* <br>
* Registries such as {@link ModuleRegistry} and {@link ServiceTaskRegistry}
* can be found as final objects in this class. These registries should only ever be accessed through
* the single Registration object in CommonsBase using {@link CommonsBase#getRegistrations()}
* Registries such as {@link ModuleRegistry} and {@link ServiceTaskRegistry} can be found as final objects in this
* class. These registries should only ever be accessed through the single Registration object in CommonsBase using
* {@link CommonsBase#getRegistrations()}
*/
public class Registration
{

View File

@ -25,8 +25,8 @@ import java.util.Set;
/**
* This class is acts as a delegate between our custom command implementation and the Bukkit API.
* <br>
* This class is not meant to be used directly, and is only public to allow for the Bukkit API to access it.
* As a result, this file will remain undocumented.
* This class is not meant to be used directly, and is only public to allow for the Bukkit API to access it. As a
* result, this file will remain undocumented.
* <span color=#ff0000>
* <br>
* This class is not thread-safe.

View File

@ -5,8 +5,8 @@ import org.bukkit.command.CommandMap;
import org.bukkit.plugin.java.JavaPlugin;
/**
* Handles the registration of commands.
* The plugin which initializes this class should be the plugin that is registering the commands.
* Handles the registration of commands. The plugin which initializes this class should be the plugin that is
* registering the commands.
*/
public class CommandHandler
{

View File

@ -4,8 +4,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* This annotation is used to mark a method as the command's default method.
* This is the method that will be run to execute the command when a user inputs /{command}
* This annotation is used to mark a method as the command's default method. This is the method that will be run to
* execute the command when a user inputs /{command}
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface Base

View File

@ -11,9 +11,8 @@ import java.lang.annotation.RetentionPolicy;
public @interface Info
{
/**
* Technically, this is the only required value you must supply yourself.
* However, it is HIGHLY recommended you supply the other optional values as well,
* for better customization of your command.
* Technically, this is the only required value you must supply yourself. However, it is HIGHLY recommended you
* supply the other optional values as well, for better customization of your command.
*
* @return The command's name.
*/

View File

@ -9,11 +9,10 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* This annotation should be used to mark methods as subcommand methods.
* Subcommand methods can have custom arguments (current supported arguments can be found in the {@link ContextProvider}),
* and can also have a custom permission. These subcommands can also be annotated with {@link Completions} to provide
* tab completions for the subcommand. The subcommand method must be public, and must be in a class that is registered
* with the {@link CommandHandler}.
* This annotation should be used to mark methods as subcommand methods. Subcommand methods can have custom arguments
* (current supported arguments can be found in the {@link ContextProvider}), and can also have a custom permission.
* These subcommands can also be annotated with {@link Completions} to provide tab completions for the subcommand. The
* subcommand method must be public, and must be in a class that is registered with the {@link CommandHandler}.
* <br>
* Tab completions with the {@link Completions} annotation are only supported for subcommands. When registering
* completions, you only need to define the completion arguments a single time. If there are other methods which

View File

@ -17,7 +17,8 @@ public class ConfigRegistry
/**
* Registers a configuration.
* @param name The name of the configuration.
*
* @param name The name of the configuration.
* @param configuration The configuration.
*/
public void register(final String name, final Configuration configuration)
@ -27,6 +28,7 @@ public class ConfigRegistry
/**
* Unregisters a configuration.
*
* @param name The name of the configuration.
*/
public void unregister(final String name)
@ -36,6 +38,7 @@ public class ConfigRegistry
/**
* Gets a configuration.
*
* @param name The name of the configuration.
* @return The configuration.
*/

View File

@ -26,6 +26,7 @@ public class EventRegistry
/**
* Registers an event.
*
* @param event The event to register.
*/
public void register(final FEvent event)
@ -35,6 +36,7 @@ public class EventRegistry
/**
* Unregisters an event.
*
* @param event The event to unregister.
*/
public void unregister(final FEvent event)
@ -46,8 +48,8 @@ public class EventRegistry
* Gets an {@link EventProvider} for the specified event class which contains the actual {@link FEvent} instance.
*
* @param clazz The event class.
* @param <T> The event type.
* @return The event provider.
* @param <T> The event type.
*/
public <T extends FEvent> EventProvider<T> getEvent(final Class<T> clazz)
{

View File

@ -26,6 +26,7 @@ public class GroupRegistry
/**
* Registers a group.
*
* @param group The group to register.
* @return {@code true} if the group was registered, {@code false} otherwise.
*/
@ -36,6 +37,7 @@ public class GroupRegistry
/**
* Unregisters a group.
*
* @param group The group to unregister.
* @return {@code true} if the group was unregistered, {@code false} otherwise.
*/
@ -46,6 +48,7 @@ public class GroupRegistry
/**
* Gets a group by name.
*
* @param name The name of the group.
* @return The group, or {@code null} if no group was found.
*/

View File

@ -21,9 +21,8 @@ import java.util.List;
* <br>
* <br>
* <b>Tasks</b> are runnable tasks which execute at the provided times in the {@link Task} and
* {@link TaskSubscription} classes. These define whether the Task is repeating, delayed, or just a one-time task.
* Tasks are registered using {@link #registerTask(TaskSubscription)} and can be started using
* {@link #startTask(Class)}.
* {@link TaskSubscription} classes. These define whether the Task is repeating, delayed, or just a one-time task. Tasks
* are registered using {@link #registerTask(TaskSubscription)} and can be started using {@link #startTask(Class)}.
* <br>
* <br>
* <b>ServiceSubscriptions</b> and <b>TaskSubscriptions</b> can both be easily obtained using the
@ -59,16 +58,14 @@ public class ServiceTaskRegistry
/**
* Starts all services registered with the registry.
* <br>
* This method should be <i>avoided</i>, due to the fact that <b><i>modules may have registered their services
* after this method
* has already been called.</i></b> In this case, it is preferred to start
* each service using {@link #startService(Class)}.
* This method should be <i>avoided</i>, due to the fact that <b><i>modules may have registered their services after
* this method has already been called.</i></b> In this case, it is preferred to start each service using
* {@link #startService(Class)}.
* <br>
* However, <i><b>Patchwork calls this method when the server is starting up</b></i>, as Patchwork is the central
* resource
* manager for registered tasks and services. Patchwork will call this method on the first server tick, so unless
* you are registering services <b>AND</b> starting them <b>POST WORLD</b>, you do not need to worry about starting
* your services.
* resource manager for registered tasks and services. Patchwork will call this method on the first server tick, so
* unless you are registering services <b>AND</b> starting them <b>POST WORLD</b>, you do not need to worry about
* starting your services.
*/
public void startAllServices()
{
@ -82,16 +79,13 @@ public class ServiceTaskRegistry
* Starts all tasks registered with the registry.
* <br>
* This method should be <i>avoided</i>, due to the fact that <b><i>modules may have registered their tasks after
* this method
* has already been called.</i></b> In this case, it is preferred to start
* each task
* using {@link #startTask(Class)}.
* this method has already been called.</i></b> In this case, it is preferred to start each task using
* {@link #startTask(Class)}.
* <br>
* However, <i><b>Patchwork calls this method when the server is starting up</b></i>, as Patchwork is the central
* resource
* manager for registered tasks and services. Patchwork will call this method on the first server tick, so unless
* you are registering tasks <b>AND</b> starting them <b>POST WORLD</b>, you do not need to worry about starting
* your tasks.
* resource manager for registered tasks and services. Patchwork will call this method on the first server tick, so
* unless you are registering tasks <b>AND</b> starting them <b>POST WORLD</b>, you do not need to worry about
* starting your tasks.
*/
public void startAllTasks()
{
@ -105,13 +99,13 @@ public class ServiceTaskRegistry
* Stops all services registered with the registry.
* <br>
* This method should be <i>avoided</i>, due to the fact that <b><i>modules should be handling their own
* registrations</i></b>.
* It is preferred to use {@link #stopService(Class)} for each service you would like to stop.
* registrations</i></b>. It is preferred to use {@link #stopService(Class)} for each service you would like to
* stop.
* <br>
* However, <b><i>Patchwork calls this method when the server is shutting down</i></b>, or when Patchwork is being
* disabled, as Patchwork is the central resource manager for registered tasks and services.
* Unless you are <b>modifying service states while the server is running</b>, you do not need to worry about
* disabling or unregistering your services.
* disabled, as Patchwork is the central resource manager for registered tasks and services. Unless you are
* <b>modifying service states while the server is running</b>, you do not need to worry about disabling or
* unregistering your services.
*/
public void stopAllServices()
{
@ -125,13 +119,12 @@ public class ServiceTaskRegistry
* Stops all tasks registered with the registry.
* <br>
* This method should be <i>avoided</i>, due to the fact that <b><i>modules should be handling their own
* registrations</i></b>.
* It is preferred to use {@link #stopTask(Class)} for each task you would like to stop.
* registrations</i></b>. It is preferred to use {@link #stopTask(Class)} for each task you would like to stop.
* <br>
* However, <b><i>Patchwork calls this method when the server is shutting down</i></b>, or when Patchwork is being
* disabled, as Patchwork is the central resource manager for registered tasks and services.
* Unless you are <b>modifying task states while the server is running</b>, you do not need to worry about
* disabling or unregistering your tasks.
* disabled, as Patchwork is the central resource manager for registered tasks and services. Unless you are
* <b>modifying task states while the server is running</b>, you do not need to worry about disabling or
* unregistering your tasks.
*/
public void stopAllTasks()
{

View File

@ -71,7 +71,8 @@ public class UserRegistry
/**
* Registers the given {@link User} and {@link UserData} objects.
* @param user The {@link User} to register.
*
* @param user The {@link User} to register.
* @param userData The {@link UserData} to register.
*/
public void registerUserData(final User user, final UserData userData)
@ -81,6 +82,7 @@ public class UserRegistry
/**
* Unregisters the given {@link User} and {@link UserData} objects.
*
* @param user The {@link User} to unregister.
*/
public void unregisterUserData(final User user)
@ -90,6 +92,7 @@ public class UserRegistry
/**
* Gets the map of {@link User} objects to {@link UserData} objects.
*
* @return The map of {@link User} objects to {@link UserData} objects.
*/
public Map<User, UserData> getUserDataMap()

View File

@ -275,6 +275,7 @@ public class BossBarDisplay
/**
* Adds a flag to the boss bar.
*
* @param flag The flag to add.
* @return The builder.
*/
@ -286,6 +287,7 @@ public class BossBarDisplay
/**
* Adds multiple flags to the boss bar.
*
* @param flags The flags to add.
* @return The builder.
*/
@ -297,6 +299,7 @@ public class BossBarDisplay
/**
* Removes a flag from the boss bar.
*
* @param flag The flag to remove.
* @return The builder.
*/
@ -308,6 +311,7 @@ public class BossBarDisplay
/**
* Removes multiple flags from the boss bar.
*
* @param flags The flags to remove.
* @return The builder.
*/
@ -319,6 +323,7 @@ public class BossBarDisplay
/**
* Clears all flags from the boss bar.
*
* @return The builder.
*/
public BossBarBuilder clearFlags()
@ -329,6 +334,7 @@ public class BossBarDisplay
/**
* Sets the color of the boss bar.
*
* @param color The color of the boss bar.
* @return The builder.
*/
@ -340,6 +346,7 @@ public class BossBarDisplay
/**
* Sets the overlay of the boss bar.
*
* @param overlay The overlay of the boss bar.
* @return The builder.
*/
@ -351,6 +358,7 @@ public class BossBarDisplay
/**
* Sets the progress of the boss bar. This must satisfy {@code 0 <= progress <= 100}.
*
* @param progress The progress of the boss bar.
* @return The builder.
*/
@ -362,6 +370,7 @@ public class BossBarDisplay
/**
* Builds the boss bar.
*
* @return The {@link BossBar}.
*/
public BossBar build()

View File

@ -3,13 +3,15 @@ package me.totalfreedom.display;
import org.bukkit.entity.Player;
/**
* Represents an action to be performed when a player clicks on an inventory slot in the respective {@link AbstractMenu}.
* Represents an action to be performed when a player clicks on an inventory slot in the respective
* {@link AbstractMenu}.
*/
@FunctionalInterface
public interface ClickAction
{
/**
* Called when a player clicks on an inventory slot in the respective {@link AbstractMenu}.
*
* @param player The player who clicked.
*/
void onClick(final Player player);

View File

@ -20,6 +20,7 @@ public class TitleDisplay
/**
* Creates a new {@link TitleDisplay} with the given {@link Title}.
*
* @param title The {@link Title} to display.
*/
public TitleDisplay(final Title title)
@ -37,6 +38,7 @@ public class TitleDisplay
/**
* Displays the {@link Title} to the given {@link Audience}.
*
* @param audience The {@link Audience} to display the {@link Title} to.
*/
public void displayTo(final Audience audience)
@ -55,6 +57,7 @@ public class TitleDisplay
/**
* Sets the {@link Title} to display.
*
* @param title The {@link Title} to display.
*/
public void setTitle(final Title title)
@ -64,6 +67,7 @@ public class TitleDisplay
/**
* Displays the {@link Title} to the given {@link ForwardingAudience}.
*
* @param forwardingAudience The {@link ForwardingAudience} to display the {@link Title} to.
*/
public void displayForwarded(final ForwardingAudience forwardingAudience)
@ -99,8 +103,7 @@ public class TitleDisplay
private Duration displayDuration;
/**
* Creates a new {@link TitleBuilder} with default values.
* The default values are:
* Creates a new {@link TitleBuilder} with default values. The default values are:
* <ul>
* <li>Empty main title</li>
* <li>Empty subtitle</li>
@ -108,6 +111,7 @@ public class TitleDisplay
* <li>Default fade out time</li>
* <li>Default display duration</li>
* </ul>
*
* @see Title#DEFAULT_TIMES
*/
public TitleBuilder()
@ -121,6 +125,7 @@ public class TitleDisplay
/**
* Sets the main title of the {@link Title}.
*
* @param title The main title of the {@link Title}.
* @return The {@link TitleBuilder} instance.
*/
@ -132,7 +137,8 @@ public class TitleDisplay
/**
* Sets the main title of the {@link Title}.
* @param title The main title of the {@link Title}.
*
* @param title The main title of the {@link Title}.
* @param titleColor The color of the main title.
* @return The {@link TitleBuilder} instance.
*/
@ -144,6 +150,7 @@ public class TitleDisplay
/**
* Sets the main title of the {@link Title}.
*
* @param mainTitle The main title of the {@link Title}.
* @return The {@link TitleBuilder} instance.
*/
@ -155,6 +162,7 @@ public class TitleDisplay
/**
* Sets the subtitle of the {@link Title}.
*
* @param title The subtitle of the {@link Title}.
* @return The {@link TitleBuilder} instance.
*/
@ -166,7 +174,8 @@ public class TitleDisplay
/**
* Sets the subtitle of the {@link Title}.
* @param title The subtitle of the {@link Title}.
*
* @param title The subtitle of the {@link Title}.
* @param titleColor The color of the subtitle.
* @return The {@link TitleBuilder} instance.
*/
@ -178,6 +187,7 @@ public class TitleDisplay
/**
* Sets the subtitle of the {@link Title}.
*
* @param subTitle The subtitle of the {@link Title}.
* @return The {@link TitleBuilder} instance.
*/
@ -189,6 +199,7 @@ public class TitleDisplay
/**
* Sets the fade in time of the {@link Title}.
*
* @param duration The fade in time of the {@link Title}.
* @return The {@link TitleBuilder} instance.
*/
@ -200,6 +211,7 @@ public class TitleDisplay
/**
* Sets the fade out time of the {@link Title}.
*
* @param duration The fade out time of the {@link Title}.
* @return The {@link TitleBuilder} instance.
*/
@ -211,6 +223,7 @@ public class TitleDisplay
/**
* Sets the display duration of the {@link Title}.
*
* @param duration The display duration of the {@link Title}.
* @return The {@link TitleBuilder} instance.
*/
@ -222,14 +235,15 @@ public class TitleDisplay
/**
* Builds the {@link Title} with the given parameters.
*
* @return The built {@link Title}.
*/
public Title build()
{
return Title.title(
this.mainTitle,
this.subTitle,
Title.Times.times(this.fadeIn, this.displayDuration, this.fadeOut)
this.mainTitle,
this.subTitle,
Title.Times.times(this.fadeIn, this.displayDuration, this.fadeOut)
);
}
}

View File

@ -6,7 +6,8 @@ package me.totalfreedom.economy;
public interface EconomicEntity
{
/**
* Gets the {@link EconomicEntityData} (which contains various common metadata about this {@link EconomicEntity}) associated with this class
* Gets the {@link EconomicEntityData} (which contains various common metadata about this {@link EconomicEntity})
* associated with this class
*
* @return the {@link EconomicEntityData}
*/

View File

@ -15,6 +15,12 @@ public interface EconomicEntityData
*/
long getBalance();
/**
* Sets the balance of the associated instance
*
* @param newBalance the new balance
*/
void setBalance(final long newBalance);
/**
* Adds the provided amount to the associated instance's balance
@ -31,11 +37,4 @@ public interface EconomicEntityData
* @return the new balance
*/
long removeFromBalance(final long amount);
/**
* Sets the balance of the associated instance
*
* @param newBalance the new balance
*/
void setBalance(final long newBalance);
}

View File

@ -3,7 +3,8 @@ package me.totalfreedom.economy;
/**
* A transaction that can be changed.
* <p>
* IMPORTANT NOTE: Please ensure that all modifications of {@link MutableTransaction} happen BEFORE it is passed to a {@link Transactor} implementation
* IMPORTANT NOTE: Please ensure that all modifications of {@link MutableTransaction} happen BEFORE it is passed to a
* {@link Transactor} implementation
*/
public interface MutableTransaction extends Transaction
{

View File

@ -1,6 +1,5 @@
package me.totalfreedom.logging;
import me.totalfreedom.sql.SQL;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
@ -120,8 +119,8 @@ public final class InteractionFormatter
final int dotIndex = trimmed.indexOf('.');
return (dotIndex != -1)
? trimmed.substring(0, dotIndex)
: trimmed;
? trimmed.substring(0, dotIndex)
: trimmed;
}
// Format: <item>,<amount>

View File

@ -0,0 +1,50 @@
package me.totalfreedom.particle;
import org.bukkit.Particle;
import org.bukkit.World;
/**
* A utility class for the 24 different note colors available in Minecraft. Each note is represented as a double value
* between 0 and 1. Furthermore, each note is a multiple of 1/24 within that range of 0 to 1.
* <p>
* For example, the note G is represented as 1/24, or 0.042. The note C is represented as 6/24, or 0.25.
* <p>
* When spawning particles, the count must be set to 0 and the extra value set between 0 and 1. The extra value is the
* size of the note particle. To add a color, use one of the provided methods in this class for the xOffset value in
* {@link World#spawnParticle(Particle, double, double, double, int, double, double, double, double)}. The xOffset value
* is the note color, with the yOffset and zOffset values set to 0.
*/
public final class NoteColorUtil
{
public static final double CYAN_NOTE_F_SHARP_LOW = 0;
public static final double CYAN_NOTE_G = 0.042;
public static final double GRAY_NOTE_G_SHARP = 0.083;
public static final double GRAY_NOTE_A = 0.125;
public static final double GRAY_NOTE_A_SHARP = 0.167;
public static final double MAGENTA_NOTE_B = 0.208;
public static final double RED_NOTE_C = 0.25;
public static final double YELLOW_NOTE_C_SHARP = 0.292;
public static final double YELLOW_NOTE_D = 0.333;
public static final double YELLOW_NOTE_D_SHARP_LOW = 0.375;
public static final double GRAY_NOTE_E = 0.417;
public static final double GRAY_NOTE_F = 0.458;
public static final double GRAY_NOTE_F_SHARP = 0.5;
public static final double LIGHT_BLUE_NOTE_G = 0.542;
public static final double BLUE_NOTE_G_SHARP = 0.583;
public static final double PURPLE_NOTE_A = 0.625;
public static final double PURPLE_NOTE_A_SHARP = 0.667;
public static final double PURPLE_NOTE_B = 0.708;
public static final double GRAY_NOTE_C = 0.75;
public static final double GRAY_NOTE_C_SHARP = 0.792;
public static final double GRAY_NOTE_D = 0.833;
public static final double YELLOW_NOTE_D_SHARP_HIGH = 0.875;
public static final double YELLOW_NOTE_E = 0.917;
public static final double YELLOW_NOTE_F = 0.958;
public static final double CYAN_NOTE_F_SHARP_HIGH = 1;
public static final double BLACK_NOTE_NA = 32768;
private NoteColorUtil()
{
throw new AssertionError();
}
}

View File

@ -1,157 +0,0 @@
package me.totalfreedom.particle;
import org.bukkit.Particle;
import org.bukkit.World;
import java.math.RoundingMode;
import java.text.DecimalFormat;
/**
* A utility class for the 24 different note colors available in Minecraft. Each note is represented as a double value
* between 0 and 1. Furthermore, each note is a multiple of 1/24 within that range of 0 to 1.
* <p>
* For example, the note G is represented as 1/24, or 0.042. The note C is represented as 6/24, or 0.25.
* <p>
* When spawning particles, the count must be set to 0 and the extra value set between 0 and 1. The extra value is the
* size of the note particle. To add a color, use one of the provided methods in this class for the xOffset value in
* {@link World#spawnParticle(Particle, double, double, double, int, double, double, double, double)}. The xOffset value
* is the note color, with the yOffset and zOffset values set to 0.
*/
public final class NoteWrapper
{
public static final double CYAN_NOTE_F_SHARP_LOW = 0;
public static final double CYAN_NOTE_F_SHARP_HIGH = 1;
private static final DecimalFormat FORMAT;
static
{
FORMAT = new DecimalFormat("#.###");
FORMAT.setRoundingMode(RoundingMode.HALF_UP);
}
private NoteWrapper()
{
throw new AssertionError();
}
private static double round(final double value)
{
return Double.parseDouble(FORMAT.format(value));
}
public static double cyanNoteG()
{
return round(1 / 24D);
}
public static double grayNoteGSharp()
{
return round(2 / 24D);
}
public static double grayNoteA()
{
return round(3 / 24D);
}
public static double grayNoteASharp()
{
return round(4 / 24D);
}
public static double magentaNoteB()
{
return round(5 / 24D);
}
public static double redNoteC()
{
return round(6 / 24D);
}
public static double yellowNoteCSharp()
{
return round(7 / 24D);
}
public static double yellowNoteD()
{
return round(8 / 24D);
}
public static double yellowNoteDSharpLow()
{
return round(9 / 24D);
}
public static double grayNoteE()
{
return round(10 / 24D);
}
public static double grayNoteF()
{
return round(11 / 24D);
}
public static double grayNoteFSharp()
{
return round(12 / 24D);
}
public static double lightBlueNoteG()
{
return round(13 / 24D);
}
public static double blueNoteGSharp()
{
return round(14 / 24D);
}
public static double purpleNoteA()
{
return round(15 / 24D);
}
public static double purpleNoteASharp()
{
return round(16 / 24D);
}
public static double purpleNoteB()
{
return round(17 / 24D);
}
public static double grayNoteC()
{
return round(18 / 24D);
}
public static double grayNoteCSharp()
{
return round(19 / 24D);
}
public static double grayNoteD()
{
return round(20 / 24D);
}
public static double yellowNoteDSharpHigh()
{
return round(21 / 24D);
}
public static double greenNoteE()
{
return round(22 / 24D);
}
public static double lightBlueNoteF()
{
return round(23 / 24D);
}
}

View File

@ -17,9 +17,8 @@ import java.util.UUID;
public interface Trail
{
/**
* Returns the UUID of the player associated with the trail. This is for usage with our persistant storage
* container so that we can safely send and retrieve the trails without having to directly reference a player
* object.
* Returns the UUID of the player associated with the trail. This is for usage with our persistant storage container
* so that we can safely send and retrieve the trails without having to directly reference a player object.
* <br>
* TL;DR Memory optimization!
*
@ -30,9 +29,9 @@ public interface Trail
/**
* Returns the player associated with this trail. Trails are user specific, and should be persistent across all
* usages. This is also used when displaying the particles, as they will be relative to the player's back, which
* is an inverse offset of the player's eye location. We use OfflinePlayer as we can make a simple check and cast
* to determine if the player is online when spawning trails.
* usages. This is also used when displaying the particles, as they will be relative to the player's back, which is
* an inverse offset of the player's eye location. We use OfflinePlayer as we can make a simple check and cast to
* determine if the player is online when spawning trails.
*
* @return The player associated with this Trail.
*/
@ -50,8 +49,8 @@ public interface Trail
TrailType getTrailType();
/**
* This method is nullable because if the value of {@link #isGradient()} is true, then
* {@link #getColors()} should be used instead, as that will contain the color data for our trail.
* This method is nullable because if the value of {@link #isGradient()} is true, then {@link #getColors()} should
* be used instead, as that will contain the color data for our trail.
* <br>
* However, this method will also be null if the particle type is not colorable.
*
@ -71,8 +70,8 @@ public interface Trail
void setColor(@NotNull Color color);
/**
* This method is nullable because if the value of {@link #isGradient()} is false, then
* {@link #getColor()} should be used instead, as our trail is a single static color.
* This method is nullable because if the value of {@link #isGradient()} is false, then {@link #getColor()} should
* be used instead, as our trail is a single static color.
* <br>
* However, this method will also be null if the particle type is not colorable.
*

View File

@ -1,6 +1,5 @@
package me.totalfreedom.particle;
import org.bukkit.Note;
import org.bukkit.Particle;
public enum TrailType

View File

@ -18,16 +18,16 @@ public class ContextProvider
public <T> T fromString(final String string, final Class<T> clazz)
{
return Stream.of(toBoolean(string),
toDouble(string),
toInt(string),
toLong(string),
toFloat(string),
toMaterial(string),
toPlayer(string),
toWorld(string),
toLocation(string),
toCommandSender(string),
toComponent(string))
toDouble(string),
toInt(string),
toLong(string),
toFloat(string),
toMaterial(string),
toPlayer(string),
toWorld(string),
toLocation(string),
toCommandSender(string),
toComponent(string))
.filter(Objects::nonNull)
.findFirst()
.map(clazz::cast)
@ -36,14 +36,12 @@ public class ContextProvider
private @Nullable Boolean toBoolean(final String string)
{
try
{
return Boolean.parseBoolean(string);
}
catch (Exception ignored)
{
return null;
}
// Previoulsy we used Boolean#parseBoolean, but that will always return a value and does not throw
// an exception. This means that if the string is not "true" or "false", it will return false.
if (string.equalsIgnoreCase("true")) return true;
if (string.equalsIgnoreCase("false")) return false;
return null;
}
private @Nullable Double toDouble(final String string)
@ -51,8 +49,7 @@ public class ContextProvider
try
{
return Double.parseDouble(string);
}
catch (Exception ignored)
} catch (NumberFormatException ignored)
{
return null;
}
@ -63,8 +60,7 @@ public class ContextProvider
try
{
return Integer.parseInt(string);
}
catch (Exception ignored)
} catch (NumberFormatException ignored)
{
return null;
}
@ -75,8 +71,7 @@ public class ContextProvider
try
{
return Long.parseLong(string);
}
catch (Exception ignored)
} catch (NumberFormatException ignored)
{
return null;
}
@ -87,8 +82,7 @@ public class ContextProvider
try
{
return Float.parseFloat(string);
}
catch (Exception ignored)
} catch (NumberFormatException ignored)
{
return null;
}

View File

@ -119,8 +119,8 @@ public class FreedomExecutor
}
/**
* Gets the synchronous executor instance. This is a convenience for {@link CompletableFuture} invocations,
* when defining a custom executor for the {@link CompletableFuture}.
* Gets the synchronous executor instance. This is a convenience for {@link CompletableFuture} invocations, when
* defining a custom executor for the {@link CompletableFuture}.
*
* @return The synchronous executor instance.
*/
@ -130,8 +130,8 @@ public class FreedomExecutor
}
/**
* Gets the asynchronous executor instance. This is a convenience for {@link CompletableFuture} invocations,
* when defining a custom executor for the {@link CompletableFuture}.
* Gets the asynchronous executor instance. This is a convenience for {@link CompletableFuture} invocations, when
* defining a custom executor for the {@link CompletableFuture}.
*
* @return The asynchronous executor instance.
*/

View File

@ -52,10 +52,10 @@ public abstract class Task extends BukkitRunnable
}
/**
* Creates a new task with the given name and delay. This will intialize a single execute task with an
* initial delay before execution.
* Creates a new task with the given name and delay. This will intialize a single execute task with an initial delay
* before execution.
*
* @param name The name of the task.
* @param name The name of the task.
* @param delay How long the task should wait before executing.
*/
protected Task(final String name, final long delay)
@ -64,44 +64,44 @@ public abstract class Task extends BukkitRunnable
}
/**
* Creates a new task with the given name and delay.
* This is the same as longs, except that here, we naturally support durations which are automatically converted to
* ticks for you. This means that using {@link Duration#ofSeconds(long)} will work as expected.
* Creates a new task with the given name and delay. This is the same as longs, except that here, we naturally
* support durations which are automatically converted to ticks for you. This means that using
* {@link Duration#ofSeconds(long)} will work as expected.
*
* @param name The name of the task.
* @param name The name of the task.
* @param delay How long the task should wait before executing.
*/
protected Task(final String name, final Duration delay)
{
this(name, DurationTools.getTickedSeconds(delay), -1L);
this(name, DurationTools.getTicks(delay), -1L);
}
/**
* Creates a new task with the given name, delay, and interval.
* This is the same as longs, except that here, we naturally support durations which are automatically converted to
* ticks for you. This means that using {@link Duration#ofSeconds(long)} will work as expected.
* Creates a new task with the given name, delay, and interval. This is the same as longs, except that here, we
* naturally support durations which are automatically converted to ticks for you. This means that using
* {@link Duration#ofSeconds(long)} will work as expected.
*
* @param name The name of the task.
* @param delay How long the task should wait before executing.
* @param name The name of the task.
* @param delay How long the task should wait before executing.
* @param interval How long the task should wait between executions.
*/
protected Task(final String name, final Duration delay, final Duration interval)
{
this(name, DurationTools.getTickedSeconds(delay), DurationTools.getTickedSeconds(interval));
this(name, DurationTools.getTicks(delay), DurationTools.getTicks(interval));
}
/**
* Creates a new task with the given name, delay, and interval.
* This method is a convenience method to use a {@link Duration} for the interval, while also being able to
* specify the delay as -1L so the task does not have an initial delay before execution.
* Creates a new task with the given name, delay, and interval. This method is a convenience method to use a
* {@link Duration} for the interval, while also being able to specify the delay as -1L so the task does not have an
* initial delay before execution.
*
* @param name The name of the task.
* @param delay The delay of the task.
* @param name The name of the task.
* @param delay The delay of the task.
* @param interval The interval of the task.
*/
protected Task(final String name, final long delay, final Duration interval)
{
this(name, delay, DurationTools.getTickedSeconds(interval));
this(name, delay, DurationTools.getTicks(interval));
}
/**

View File

@ -9,10 +9,10 @@ import org.bukkit.scheduler.BukkitTask;
import java.util.concurrent.Executor;
/**
* Represents a subscription to a task. Task subscriptions offer a nice wrapper for managing tasks, which are
* inevitably just bukkit runnables with a bit more lenience in terms of instantiation modification and execution.
* It also offers a more intuitive way to manage our tasks; rather than having to keep track of task ids for each
* {@link BukkitTask} object that gets returned by the {@link BukkitScheduler}.
* Represents a subscription to a task. Task subscriptions offer a nice wrapper for managing tasks, which are inevitably
* just bukkit runnables with a bit more lenience in terms of instantiation modification and execution. It also offers a
* more intuitive way to manage our tasks; rather than having to keep track of task ids for each {@link BukkitTask}
* object that gets returned by the {@link BukkitScheduler}.
*
* @param <T> The type of task.
*/

View File

@ -10,25 +10,29 @@ import net.kyori.adventure.bossbar.BossBar;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class ReactionTask extends Task implements Listener {
public class ReactionTask extends Task implements Listener
{
private final Reaction reaction;
private final BossBarDisplay bossBarDisplay;
public ReactionTask(final String name, final Reaction reaction) {
public ReactionTask(final String name, final Reaction reaction)
{
super(name, -1L, -1);
this.reaction = reaction;
final BossBar bossBar = BossBarDisplay.builder()
.setName(reaction.getReactionMessage())
.setColor(BossBar.Color.GREEN)
.setProgress(0.0F)
.build();
.setName(reaction.getReactionMessage())
.setColor(BossBar.Color.GREEN)
.setProgress(0.0F)
.build();
this.bossBarDisplay = new BossBarDisplay(bossBar);
}
@Override
public void run() {
if (isCancelled()) {
public void run()
{
if (isCancelled())
{
}
final BossBarTimer timer = new BossBarTimer(bossBarDisplay, reaction.getReactionDuration());
@ -36,13 +40,15 @@ public class ReactionTask extends Task implements Listener {
}
@EventHandler
public void onPlayerChat(final AsyncChatEvent event) {
public void onPlayerChat(final AsyncChatEvent event)
{
if (event.message()
.equals(reaction.getReactionMessage())) {
.equals(reaction.getReactionMessage()))
{
final EconomicEntity entity = CommonsBase.getInstance()
.getRegistrations()
.getUserRegistry()
.getUser(event.getPlayer());
.getRegistrations()
.getUserRegistry()
.getUser(event.getPlayer());
reaction.onReact(entity);
}

View File

@ -22,10 +22,10 @@ public interface SQLProperties
default String toURLPlain()
{
return String.format("jdbc:%s://%s:%s/%s",
this.getDriver(),
this.getHost(),
this.getPort(),
this.getDatabase());
this.getDriver(),
this.getHost(),
this.getPort(),
this.getDatabase());
}
String getDriver();
@ -39,12 +39,12 @@ public interface SQLProperties
default String toURLWithLogin()
{
return String.format("jdbc:%s://%s:%s/%s?user=%s&password=%s",
this.getDriver(),
this.getHost(),
this.getPort(),
this.getDatabase(),
this.getUsername(),
this.getPassword());
this.getDriver(),
this.getHost(),
this.getPort(),
this.getDatabase(),
this.getUsername(),
this.getPassword());
}
String getUsername();

View File

@ -16,7 +16,7 @@ public final class DurationTools
throw new AssertionError();
}
public static final long getTickedSeconds(final Duration duration)
public static final long getTicks(final Duration duration)
{
return duration.toMillis() / 50L;
}

View File

@ -34,7 +34,7 @@ public final class InterpolationUtils
}
private static Set<Color> hsvGradient(final int length, final Color from, final Color to,
final Interpolator interpolator)
final Interpolator interpolator)
{
// returns a float-array where hsv[0] = hue, hsv[1] = saturation, hsv[2] = value/brightness
final float[] hsvFrom = java.awt.Color.RGBtoHSB(from.getRed(), from.getGreen(), from.getBlue(), null);
@ -69,18 +69,18 @@ public final class InterpolationUtils
{
final LinkedHashSet<TextColor> base = new LinkedHashSet<>();
final Set<TextColor> redToOrange = componentRGBGradient(length, NamedTextColor.RED,
NamedTextColor.GOLD, InterpolationUtils::linear);
NamedTextColor.GOLD, InterpolationUtils::linear);
final Set<TextColor> orangeToYellow = componentRGBGradient(length, NamedTextColor.GOLD,
NamedTextColor.YELLOW, InterpolationUtils::linear);
NamedTextColor.YELLOW, InterpolationUtils::linear);
final Set<TextColor> yellowToGreen = componentRGBGradient(length, NamedTextColor.YELLOW,
NamedTextColor.GREEN, InterpolationUtils::linear);
NamedTextColor.GREEN, InterpolationUtils::linear);
final Set<TextColor> greenToBlue = componentRGBGradient(length, NamedTextColor.GREEN,
NamedTextColor.BLUE, InterpolationUtils::linear);
NamedTextColor.BLUE, InterpolationUtils::linear);
final Set<TextColor> blueToPurple = componentRGBGradient(length, NamedTextColor.BLUE,
NamedTextColor.LIGHT_PURPLE,
InterpolationUtils::linear);
NamedTextColor.LIGHT_PURPLE,
InterpolationUtils::linear);
final Set<TextColor> purpleToRed = componentRGBGradient(length, TextColor.color(75, 0, 130),
TextColor.color(255, 0, 0), InterpolationUtils::linear);
TextColor.color(255, 0, 0), InterpolationUtils::linear);
base.addAll(redToOrange);
base.addAll(orangeToYellow);
base.addAll(yellowToGreen);
@ -91,7 +91,7 @@ public final class InterpolationUtils
}
private static Set<TextColor> componentRGBGradient(final int length, final TextColor from, final TextColor to,
final Interpolator interpolator)
final Interpolator interpolator)
{
final double[] r = interpolator.interpolate(from.red(), to.red(), length);
final double[] g = interpolator.interpolate(from.green(), to.green(), length);
@ -113,7 +113,7 @@ public final class InterpolationUtils
}
private static Set<Color> rgbGradient(final int length, final Color from, final Color to,
final Interpolator interpolator)
final Interpolator interpolator)
{
final double[] r = interpolator.interpolate(from.getRed(), to.getRed(), length);
final double[] g = interpolator.interpolate(from.getGreen(), to.getGreen(), length);

View File

@ -21,7 +21,7 @@ public class ShapeUtils
}
public List<Location> generate(final int count, final DoubleUnaryOperator x, final DoubleUnaryOperator y,
final DoubleUnaryOperator z)
final DoubleUnaryOperator z)
{
final double step = (start - end) / (count - 1);
final LinkedList<Location> lset = new LinkedList<>();

View File

@ -1,12 +1,12 @@
package me.totalfreedom.utils.container;
public final class Tuple<A, B, C>
public final class Trio<A, B, C>
{
private final A a;
private final B b;
private final C c;
public Tuple(final A a, final B b, final C c)
public Trio(final A a, final B b, final C c)
{
this.a = a;
this.b = b;

View File

@ -1,12 +1,12 @@
package me.totalfreedom.utils.container;
public class UnaryTuple<T>
public class UnaryTrio<T>
{
private final T primary;
private final T secondary;
private final T tertiary;
public UnaryTuple(final T primary, final T secondary, final T tertiary)
public UnaryTrio(final T primary, final T secondary, final T tertiary)
{
this.primary = primary;
this.secondary = secondary;

View File

@ -12,7 +12,7 @@ import java.util.function.Supplier;
public class FreedomAdventure
{
private static final PlainTextComponentSerializer PLAIN_TEXT_COMPONENT_SERIALIZER =
PlainTextComponentSerializer.plainText();
PlainTextComponentSerializer.plainText();
private FreedomAdventure()
{

View File

@ -35,14 +35,14 @@ public class FreedomMiniMessage
private static final MiniMessage unsafe = MiniMessage.miniMessage();
private static final MiniMessage safe = MiniMessage.builder()
.tags(TagResolver.resolver(
StandardTags.color(),
StandardTags.rainbow(),
StandardTags.gradient(),
StandardTags.newline(),
StandardTags.decorations(TextDecoration.ITALIC),
StandardTags.decorations(TextDecoration.BOLD),
StandardTags.decorations(TextDecoration.STRIKETHROUGH),
StandardTags.decorations(TextDecoration.UNDERLINED)
StandardTags.color(),
StandardTags.rainbow(),
StandardTags.gradient(),
StandardTags.newline(),
StandardTags.decorations(TextDecoration.ITALIC),
StandardTags.decorations(TextDecoration.BOLD),
StandardTags.decorations(TextDecoration.STRIKETHROUGH),
StandardTags.decorations(TextDecoration.UNDERLINED)
))
.build();
@ -52,9 +52,8 @@ public class FreedomMiniMessage
}
/**
* Deserializes an input string using an instance of MiniMessage that is either safe (resolves only a specific
* set of tags)
* or unsafe (resolves all tags).
* Deserializes an input string using an instance of MiniMessage that is either safe (resolves only a specific set
* of tags) or unsafe (resolves all tags).
*
* @param safe Whether to use a safe instance of MiniMessage
* @param input An input string formatted with MiniMessage's input

View File

@ -9,12 +9,11 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
/**
* This class contains different methods to provide {@link ChatType.Bound} instances for sending messages to players
* in game.
* This is now a requirement for all message requests to players due to the new chat signature system.
* This class contains different methods to provide {@link ChatType.Bound} instances for sending messages to players in
* game. This is now a requirement for all message requests to players due to the new chat signature system.
* <br>
* Even though Scissors has this feature disabled, upstream (Paper) and Kyori Adventure
* have made the appropriate API changes to accomodate chat signatures.
* Even though Scissors has this feature disabled, upstream (Paper) and Kyori Adventure have made the appropriate API
* changes to accomodate chat signatures.
* <br>
* As a result, we need to conform to those specifications even if we do not use this feature.
*/
@ -34,8 +33,8 @@ public final class KyoriConstants
/**
* Represents a Chat Bound for a plugin.
* <br>
* This is a convenience method so you are not required to dependency inject
* your plugin instance any time that you need a Bound.
* This is a convenience method so you are not required to dependency inject your plugin instance any time that you
* need a Bound.
*
* @param pluginClass The plugin class to get the plugin instance from.
* @return A ChatType.Bound instance for the plugin.
@ -55,11 +54,10 @@ public final class KyoriConstants
}
/**
* Represents a Chat Bound for a player.
* Chat bounds are required for sending messages to players.
* Represents a Chat Bound for a player. Chat bounds are required for sending messages to players.
* <br>
* The chat bound is a representation of a validated chat signature,
* which is tied directly to the user's account name. In our case, this is the player's name.
* The chat bound is a representation of a validated chat signature, which is tied directly to the user's account
* name. In our case, this is the player's name.
*
* @param player The player to get the bound for.
* @return A ChatType.Bound instance for the player.
@ -72,8 +70,8 @@ public final class KyoriConstants
/**
* Represents a Chat Bound for the console.
* <br>
* The chat bound is a representation of a validated chat signature,
* which is tied directly to the user's account name. In our case, this is the player's name.
* The chat bound is a representation of a validated chat signature, which is tied directly to the user's account
* name. In our case, this is the player's name.
*
* @param sender The console to get the bound for.
* @return A ChatType.Bound instance for the console.

View File

@ -33,8 +33,7 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log a message to the console,
* while also returning a Component that could be used to
* This method allows you to log a message to the console, while also returning a Component that could be used to
* message a player.
*
* @param message The message to send.
@ -47,8 +46,7 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log a component to the console,
* while also returning a String representation of the
* This method allows you to log a component to the console, while also returning a String representation of the
* component
*
* @param component The component to send.
@ -71,7 +69,9 @@ public class FreedomLogger implements Audience
logger.info(plainText);
return plainText;
} /**
}
/**
* This method allows you to log a message to the console.
*
* @param message The message to send.
@ -104,9 +104,8 @@ public class FreedomLogger implements Audience
}
/**
* This method logs an error message to the console.
* It is highly recommended to deconstruct the stack trace and pass it
* in a more readable format to this method.
* This method logs an error message to the console. It is highly recommended to deconstruct the stack trace and
* pass it in a more readable format to this method.
*
* @param message The message to send.
*/
@ -126,11 +125,9 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log an error message to the console,
* while also returning a Component that could be used to
* message a player. It is highly recommended that you deconstruct and limit
* the stack trace before passing it to this method, if you are intending to
* use it for player communication.
* This method allows you to log an error message to the console, while also returning a Component that could be
* used to message a player. It is highly recommended that you deconstruct and limit the stack trace before passing
* it to this method, if you are intending to use it for player communication.
*
* @param message The message to send.
* @return A component representation of the message.
@ -142,9 +139,8 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log an error component to the console,
* while also returning a String representation of the error
* component.
* This method allows you to log an error component to the console, while also returning a String representation of
* the error component.
*
* @param component The component to send.
* @return A String representation of the component.
@ -169,10 +165,9 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log a debug message to the console,
* while also returning a Component that could be used to
* message a player. This method will only log if debug mode is enabled.
* If debug mode is not enabled, this method will return an empty component.
* This method allows you to log a debug message to the console, while also returning a Component that could be used
* to message a player. This method will only log if debug mode is enabled. If debug mode is not enabled, this
* method will return an empty component.
*
* @param message The message to send.
* @return A component representation of the message.
@ -188,8 +183,8 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log a debug component to the console,
* while also returning a String representation of the debug component.
* This method allows you to log a debug component to the console, while also returning a String representation of
* the debug component.
*
* @param component The component to send.
* @return A String representation of the message.
@ -204,8 +199,8 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log a debug component to the console.
* This method will only log if debug mode is enabled.
* This method allows you to log a debug component to the console. This method will only log if debug mode is
* enabled.
*
* @param component The component to send.
*/
@ -219,8 +214,8 @@ public class FreedomLogger implements Audience
}
/**
* This method allows you to log a debug message to the console.
* This method will only log if debug mode is enabled.
* This method allows you to log a debug message to the console. This method will only log if debug mode is
* enabled.
*
* @param message The message to send.
*/
@ -231,8 +226,6 @@ public class FreedomLogger implements Audience
}
@Override
public void sendMessage(@NotNull final ComponentLike message)
{
@ -269,7 +262,7 @@ public class FreedomLogger implements Audience
public void sendMessage(@NotNull final SignedMessage signedMessage, final ChatType.@NotNull Bound boundChatType)
{
this.info(
signedMessage.message()); // TODO: We might want to investigate whether this logs the ENTIRE message,
signedMessage.message()); // TODO: We might want to investigate whether this logs the ENTIRE message,
// including unsigned & signed content, or only the signed part. This method was written in the assumption
// that it provided all content.
}

View File

@ -91,7 +91,7 @@ Datura:
- [ ] Permission Handling *(In Progress...)*
- [ ] Permission Registration & Assignment *(In Progress...)*
- [ ] SQL Data Handling *(In Progress...)*
- [ ] Configuration Implementations
- [ ] Configuration Implementations
- [ ] User Data Implementations *(In Progress...)*
- [x] Punishment Systems (e.x. Locker, Halter, Cager)
@ -101,7 +101,7 @@ Fossil:
- [ ] Particle Implementation / Trails *(In Progress...)*
- [ ] Command Implementations *(In Progress...)*
- [ ] Implement a shop for the economy *(In Progress...)*
- [ ] Chat reaction / game system
- [ ] Chat reaction / game system
- [ ] Jumppads
Corvo: