From b4a6ce1a77dcd92db81c18741249fb56d9be87c5 Mon Sep 17 00:00:00 2001
From: EpicKnarvik97 The version of the new update available The version number if an update is available. Null otherwise An instance of this plugin, or null if not instantiated The request to add A block change request queue The sender for sending messages to players The object containing gate configuration values This plugin's version The logger The class name/route where something happened A message describing what happened The message to log The message to log The message to log The severity of the event triggering the message The message to log The folder for storing the portal database The folder storing gate files The default network The name/key of the string to get The full translated string The name/key of the string to get The full string in the backup language (English) The replacement value The input string with the search replaced with value A plugin manager The object containing economy config values The raw configuration The chunk unload queue The new chunk unload request to add The stargate configuration The command sender that changed the value The new value of the config option The new value of the config option The configuration file to save to The command sender that changed the value The new value of the config option The command sender that changed the value The arguments for the new config option The arguments given by the user The per-sign color string to update with, or null if the input was invalid The new color string to replace any previous value with The file configuration to update with the new per-sign colors The color chosen by the user True if the given color is valid The config option that was changed The command sender that executed the config command The command sender to alert if the color is invalid The new option value The value to parse The parsed color or null The value given An integer, or null if it was invalid The value given A double, or null if it was invalid The command sender initiating the reload The changed config option The command sender that sent the command The config option to print information about The command sender to display the config list to The option to describe A string describing the config option The beginning of the typed text, for filtering matching results Some or all of the valid values for the option The arguments given by the user Some or all of the valid values for the option The arguments given by the user The options to give the user The string to make into a list A list containing the string value The available chat colors The command sender to get available commands for The commands available to the command sender The description of what this config option does The default value of this config option The name of the config option to get The corresponding config option, or null if the name is invalid The name of this config option The data type used This config option's config node The description of this config option This config option's default value The config options included in this tag The config option to check True of the config option is tagged The config option to check True if changing the config option requires a "reload of colors" to take effect The config option to check True if changing the config option requires a full reload to take effect The config option to check True if changing the config option requires a reload of all dynmap markers The config option to check True if changing the config option requires a portal reload to take effect The config option to check True if the language loader requires a reload The config option to check True if economy requires a reload A reference If dynmap has an invalid state The portal to add a marker for The portal to remove the marker for The portal to get a marker id for The loaded config options to read An economy object, or null if economy is disabled or not initialized An instance of the Vault plugin, or null if Vault is not loaded The account all taxes are paid to The amount to display A formatted text string describing the amount The plugin manager to get plugins from True if economy was enabled The gate type used The cost of creating the gate The gate type used The cost of destroying the gate The free.permissionNode necessary to allow free gate {action} The folder containing the language files The name/key of the string to display The string in the user's preferred language The name/key of the string to display The string in the backup language (English) The new plugin language The language to update The current values of the loaded/processed language if unable to read a language file Any custom language strings not recognized If unable to write to the language file The language to load A mapping between loaded string indexes and the strings to display An optional input stream to use. Defaults to using a file input stream A mapping between loaded string indexes and the strings to display The language loader to get translated strings from The player to send the message to The message to send The player to send the message to The message to send The message to send Whether the message sent is an error The logger to use for logging errors A reference to the config options map The loaded config options The open portals queue The active portals queue The object containing economy config values The sender of the reload request The managed worlds The name of the world to manage The name of the world to stop managing Gets the gate config The current config to back up The portal folder The folder storing gate files The sender for sending messages to players The language loader The loaded config options to use The specified default colors The list of color maps to save the resulting colors to
The indentation of the current block comment
* @param commentIdThe id of the comment
*/ - private void addYamlString(StringBuilder yamlBuilder, ListThe list to add to
* @param commentThe comment to add
*/ - private void addComment(ListThe unique id of the comment
* @param indentationThe indentation to add to every line
*/ - private void generateCommentYAML(StringBuilder yamlBuilder, ListA string using the YAML format
* @returnThe corresponding comment string
*/ - private String convertYAMLMappingsToComments(String yamlString) { + @NotNull + private String convertYAMLMappingsToComments(@NotNull String yamlString) { StringBuilder finalText = new StringBuilder(); String[] lines = yamlString.split("\n"); @@ -173,7 +178,8 @@ public class StargateYamlConfiguration extends YamlConfiguration { * @param commentIndentationThe indentation of the read comment
* @returnThe index containing the next non-comment line
*/ - private int readComment(StringBuilder builder, String[] lines, int startIndex, int commentIndentation) { + private int readComment(@NotNull StringBuilder builder, @NotNull String[] lines, int startIndex, + int commentIndentation) { for (int currentIndex = startIndex; currentIndex < lines.length; currentIndex++) { String line = lines[currentIndex]; String possibleComment = line.trim(); @@ -194,6 +200,7 @@ public class StargateYamlConfiguration extends YamlConfiguration { * @param indentationSpacesThe number spaces to use for indentation
* @returnA string containing the number of spaces specified
*/ + @NotNull private String addIndentation(int indentationSpaces) { return " ".repeat(Math.max(0, indentationSpaces)); } @@ -205,7 +212,7 @@ public class StargateYamlConfiguration extends YamlConfiguration { * @param lineThe line to get indentation of
* @returnThe number of spaces in the line's indentation
*/ - private int getIndentation(String line) { + private int getIndentation(@NotNull String line) { int spacesFound = 0; for (char aCharacter : line.toCharArray()) { if (aCharacter == ' ') { diff --git a/src/main/java/net/knarcraft/stargate/container/BlockChangeRequest.java b/src/main/java/net/knarcraft/stargate/container/BlockChangeRequest.java index 55e5269..3603503 100644 --- a/src/main/java/net/knarcraft/stargate/container/BlockChangeRequest.java +++ b/src/main/java/net/knarcraft/stargate/container/BlockChangeRequest.java @@ -2,6 +2,8 @@ package net.knarcraft.stargate.container; import org.bukkit.Axis; import org.bukkit.Material; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Represents a request for changing a block into another material @@ -19,7 +21,7 @@ public class BlockChangeRequest { * @param materialThe new material to change the block to
* @param axisThe new axis to orient the block along
*/ - public BlockChangeRequest(BlockLocation blockLocation, Material material, Axis axis) { + public BlockChangeRequest(@NotNull BlockLocation blockLocation, @NotNull Material material, @Nullable Axis axis) { this.blockLocation = blockLocation; newMaterial = material; newAxis = axis; @@ -30,6 +32,7 @@ public class BlockChangeRequest { * * @returnThe location of the block
*/ + @NotNull public BlockLocation getBlockLocation() { return blockLocation; } @@ -39,6 +42,7 @@ public class BlockChangeRequest { * * @returnThe material to change the block into
*/ + @NotNull public Material getMaterial() { return newMaterial; } @@ -48,6 +52,7 @@ public class BlockChangeRequest { * * @returnThe axis to orient the block along
*/ + @Nullable public Axis getAxis() { return newAxis; } diff --git a/src/main/java/net/knarcraft/stargate/container/BlockLocation.java b/src/main/java/net/knarcraft/stargate/container/BlockLocation.java index bb8b533..bf84940 100644 --- a/src/main/java/net/knarcraft/stargate/container/BlockLocation.java +++ b/src/main/java/net/knarcraft/stargate/container/BlockLocation.java @@ -10,6 +10,8 @@ import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; import org.bukkit.block.data.type.Sign; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * This class represents a block location @@ -30,7 +32,7 @@ public class BlockLocation extends Location { * @param yThe y coordinate of the block
* @param zThe z coordinate of the block
*/ - public BlockLocation(World world, int x, int y, int z) { + public BlockLocation(@NotNull World world, int x, int y, int z) { super(world, x, y, z); } @@ -39,7 +41,7 @@ public class BlockLocation extends Location { * * @param blockThe block to get the location of
*/ - public BlockLocation(Block block) { + public BlockLocation(@NotNull Block block) { super(block.getWorld(), block.getX(), block.getY(), block.getZ()); } @@ -49,7 +51,7 @@ public class BlockLocation extends Location { * @param worldThe world the block exists in
* @param stringA comma separated list of x, y and z coordinates as integers
*/ - public BlockLocation(World world, String string) { + public BlockLocation(@NotNull World world, @NotNull String string) { super(world, Integer.parseInt(string.split(",")[0]), Integer.parseInt(string.split(",")[1]), Integer.parseInt(string.split(",")[2])); } @@ -62,6 +64,7 @@ public class BlockLocation extends Location { * @param zThe number of blocks to move in the z-direction
* @returnA new block location
*/ + @NotNull public BlockLocation makeRelativeBlockLocation(int x, int y, int z) { return (BlockLocation) this.clone().add(x, y, z); } @@ -75,6 +78,7 @@ public class BlockLocation extends Location { * @param yawThe number of blocks to move in the z-direction
* @returnA new location
*/ + @NotNull public Location makeRelativeLocation(double x, double y, double z, float yaw) { Location newLocation = this.clone(); newLocation.setYaw(yaw); @@ -89,9 +93,10 @@ public class BlockLocation extends Location { * @param yawThe yaw pointing outwards from a portal (in the relative vector's out direction)
* @returnA location relative to this location
*/ - public BlockLocation getRelativeLocation(RelativeBlockVector relativeVector, double yaw) { - Vector realVector = DirectionHelper.getCoordinateVectorFromRelativeVector(relativeVector.getRight(), - relativeVector.getDown(), relativeVector.getOut(), yaw); + @NotNull + public BlockLocation getRelativeLocation(@NotNull RelativeBlockVector relativeVector, double yaw) { + Vector realVector = DirectionHelper.getCoordinateVectorFromRelativeVector(relativeVector.right(), + relativeVector.down(), relativeVector.out(), yaw); return makeRelativeBlockLocation(realVector.getBlockX(), realVector.getBlockY(), realVector.getBlockZ()); } @@ -107,6 +112,7 @@ public class BlockLocation extends Location { * @param portalYawThe yaw when looking out from the portal
* @return A new location relative to this block location */ + @NotNull public Location getRelativeLocation(double right, double down, double out, float portalYaw) { Vector realVector = DirectionHelper.getCoordinateVectorFromRelativeVector(right, down, out, portalYaw); return makeRelativeLocation(0.5 + realVector.getBlockX(), realVector.getBlockY(), @@ -118,6 +124,7 @@ public class BlockLocation extends Location { * * @returnThe block's material type
*/ + @NotNull public Material getType() { return this.getBlock().getType(); } @@ -127,7 +134,7 @@ public class BlockLocation extends Location { * * @param typeThe block's new material type
*/ - public void setType(Material type) { + public void setType(@NotNull Material type) { this.getBlock().setType(type); } @@ -136,6 +143,7 @@ public class BlockLocation extends Location { * * @returnThe location representing this block location
*/ + @NotNull public Location getLocation() { return this.clone(); } @@ -148,6 +156,7 @@ public class BlockLocation extends Location { * * @returnThis block location's parent block
*/ + @Nullable public Block getParent() { if (parent == null) { findParent(); @@ -184,6 +193,7 @@ public class BlockLocation extends Location { } @Override + @NotNull public String toString() { return String.valueOf(this.getBlockX()) + ',' + this.getBlockY() + ',' + this.getBlockZ(); } @@ -203,7 +213,7 @@ public class BlockLocation extends Location { } @Override - public boolean equals(Object object) { + public boolean equals(@Nullable Object object) { if (this == object) { return true; } diff --git a/src/main/java/net/knarcraft/stargate/container/ChunkUnloadRequest.java b/src/main/java/net/knarcraft/stargate/container/ChunkUnloadRequest.java index 4c47d15..de62651 100644 --- a/src/main/java/net/knarcraft/stargate/container/ChunkUnloadRequest.java +++ b/src/main/java/net/knarcraft/stargate/container/ChunkUnloadRequest.java @@ -17,7 +17,7 @@ public class ChunkUnloadRequest implements ComparableThe chunk to request the unloading of
* @param timeUntilUnloadThe time in milliseconds to wait before unloading the chunk
*/ - public ChunkUnloadRequest(Chunk chunkToUnload, Long timeUntilUnload) { + public ChunkUnloadRequest(@NotNull Chunk chunkToUnload, @NotNull Long timeUntilUnload) { this.chunkToUnload = chunkToUnload; long systemNanoTime = System.nanoTime(); this.unloadNanoTime = systemNanoTime + (timeUntilUnload * 1000000); @@ -28,6 +28,7 @@ public class ChunkUnloadRequest implements ComparableThe chunk to unload
*/ + @NotNull public Chunk getChunkToUnload() { return this.chunkToUnload; } @@ -37,11 +38,13 @@ public class ChunkUnloadRequest implements ComparableThe system nano time denoting when the chunk is to be unloaded
*/ + @NotNull public Long getUnloadNanoTime() { return this.unloadNanoTime; } @Override + @NotNull public String toString() { return "{" + chunkToUnload + ", " + unloadNanoTime + "}"; } diff --git a/src/main/java/net/knarcraft/stargate/container/FromTheEndTeleportation.java b/src/main/java/net/knarcraft/stargate/container/FromTheEndTeleportation.java index 54c7171..736f847 100644 --- a/src/main/java/net/knarcraft/stargate/container/FromTheEndTeleportation.java +++ b/src/main/java/net/knarcraft/stargate/container/FromTheEndTeleportation.java @@ -1,60 +1,16 @@ package net.knarcraft.stargate.container; import net.knarcraft.stargate.portal.Portal; -import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; /** - * This class represents a player teleporting from the end to the over-world using an artificial end portal + * This class represents a teleportation from the end to the over-world using an artificial end portal * *This is necessary because a player entering an end portal in the end is a special case. Instead of being * teleported, the player is respawned. Because of this, the teleportation needs to be saved and later used to hijack * the position of where the player is to respawn.
+ * + * @param exitPortalThe portal the player should exit from when arriving in the over-world
*/ -public class FromTheEndTeleportation { - - private final Player teleportingPlayer; - private final Portal exitPortal; - - /** - * Instantiates a new teleportation from the end - * - * @param teleportingPlayerThe teleporting player
- * @param exitPortalThe portal to exit from
- */ - public FromTheEndTeleportation(Player teleportingPlayer, Portal exitPortal) { - this.teleportingPlayer = teleportingPlayer; - this.exitPortal = exitPortal; - } - - /** - * Gets the teleporting player - * - * @returnThe teleporting player
- */ - public Player getPlayer() { - return this.teleportingPlayer; - } - - /** - * Gets the portal to exit from - * - * @returnThe portal to exit from
- */ - public Portal getExit() { - return this.exitPortal; - } - - @Override - public int hashCode() { - return teleportingPlayer.hashCode(); - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof FromTheEndTeleportation otherTeleportation)) { - return false; - } - return teleportingPlayer.equals(otherTeleportation.teleportingPlayer); - } - +public record FromTheEndTeleportation(@NotNull Portal exitPortal) { } diff --git a/src/main/java/net/knarcraft/stargate/container/RelativeBlockVector.java b/src/main/java/net/knarcraft/stargate/container/RelativeBlockVector.java index 847c7ff..e06d08e 100644 --- a/src/main/java/net/knarcraft/stargate/container/RelativeBlockVector.java +++ b/src/main/java/net/knarcraft/stargate/container/RelativeBlockVector.java @@ -1,5 +1,8 @@ package net.knarcraft.stargate.container; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + /** * This stores a block location as a vector relative to a position * @@ -7,62 +10,48 @@ package net.knarcraft.stargate.container; * top-left block of a gate (top-left when looking at the side with the sign). The right is therefore the distance * from the top-left corner towards the top-right corner. Down is the distance from the top-left corner towards the * bottom-left corner. Out is the distance outward from the gate. + * + *Relative block vectors start from a top-left corner. A yaw is used to orient a relative block vector in the + * "real world". In terms of a gate layout, the origin is 0,0. Right is towards the end of the line. Down is to the + * next line. Out is towards the observer.
+ * + * @param rightThe distance rightward relative to the origin
+ * @param downThe distance downward relative to the origin
+ * @param outThe distance outward relative to the origin
*/ -public class RelativeBlockVector { - - private final int right; - private final int down; - private final int out; +public record RelativeBlockVector(int right, int down, int out) { /** - * A specifier for one of the relative block vector's three properties + * Adds the given value to this relative block vector's "right" property + * + * @param valueToAddThe value to add
+ * @returnThe new resulting vector
*/ - public enum Property { - /** - * Specifies the relative block vector's right property - */ - RIGHT, - /** - * Specifies the relative block vector's down property - */ - DOWN, - /** - * Specifies the relative block vector's out property - */ - OUT + @NotNull + public RelativeBlockVector addRight(int valueToAdd) { + return new RelativeBlockVector(this.right + valueToAdd, this.down, this.out); } /** - * Instantiates a new relative block vector + * Adds the given value to this relative block vector's "down" property * - *Relative block vectors start from a top-left corner. A yaw is used to orient a relative block vector in the - * "real world". - * In terms of a gate layout, the origin is 0,0. Right is towards the end of the line. Down is to the - * next line. Out is towards the observer.
- * - * @param rightThe distance rightward relative to the origin
- * @param downThe distance downward relative to the origin
- * @param outThe distance outward relative to the origin
+ * @param valueToAddThe value to add
+ * @returnThe new resulting vector
*/ - public RelativeBlockVector(int right, int down, int out) { - this.right = right; - this.down = down; - this.out = out; + @NotNull + public RelativeBlockVector addDown(int valueToAdd) { + return new RelativeBlockVector(this.right, this.down + valueToAdd, this.out); } /** - * Adds a value to one of the properties of this relative block vector + * Adds the given value to this relative block vector's "out" property * - * @param propertyToAddToThe property to add to
- * @param valueToAddThe value to add to the property (negative to move in the opposite direction)
- * @returnA new relative block vector with the property altered
+ * @param valueToAddThe value to add
+ * @returnThe new resulting vector
*/ - public RelativeBlockVector addToVector(Property propertyToAddTo, int valueToAdd) { - return switch (propertyToAddTo) { - case RIGHT -> new RelativeBlockVector(this.right + valueToAdd, this.down, this.out); - case DOWN -> new RelativeBlockVector(this.right, this.down + valueToAdd, this.out); - case OUT -> new RelativeBlockVector(this.right, this.down, this.out + valueToAdd); - }; + @NotNull + public RelativeBlockVector addOut(int valueToAdd) { + return new RelativeBlockVector(this.right, this.down, this.out + valueToAdd); } /** @@ -70,6 +59,7 @@ public class RelativeBlockVector { * * @returnThis vector, but inverted
*/ + @NotNull public RelativeBlockVector invert() { return new RelativeBlockVector(-this.right, -this.down, -this.out); } @@ -79,7 +69,8 @@ public class RelativeBlockVector { * * @returnThe distance to the right relative to the origin
*/ - public int getRight() { + @Override + public int right() { return right; } @@ -88,7 +79,8 @@ public class RelativeBlockVector { * * @returnThe distance downward relative to the origin
*/ - public int getDown() { + @Override + public int down() { return down; } @@ -97,17 +89,19 @@ public class RelativeBlockVector { * * @returnThe distance outward relative to the origin
*/ - public int getOut() { + @Override + public int out() { return out; } @Override + @NotNull public String toString() { return String.format("(right = %d, down = %d, out = %d)", right, down, out); } @Override - public boolean equals(Object other) { + public boolean equals(@Nullable Object other) { if (other == this) { return true; } diff --git a/src/main/java/net/knarcraft/stargate/container/SignData.java b/src/main/java/net/knarcraft/stargate/container/SignData.java index ccb25fb..8d65caa 100644 --- a/src/main/java/net/knarcraft/stargate/container/SignData.java +++ b/src/main/java/net/knarcraft/stargate/container/SignData.java @@ -5,6 +5,7 @@ import net.knarcraft.stargate.utility.SignHelper; import net.md_5.bungee.api.ChatColor; import org.bukkit.DyeColor; import org.bukkit.block.Sign; +import org.jetbrains.annotations.NotNull; /** * A class that keeps track of the sign colors for a given sign @@ -23,7 +24,7 @@ public class SignData { * @param mainSignColorThe main color to use for the sign
* @param highlightSignColorThe highlighting color to use for the sign
*/ - public SignData(Sign sign, ChatColor mainSignColor, ChatColor highlightSignColor) { + public SignData(@NotNull Sign sign, @NotNull ChatColor mainSignColor, @NotNull ChatColor highlightSignColor) { this.sign = sign; this.mainSignColor = mainSignColor; this.highlightSignColor = highlightSignColor; @@ -35,6 +36,7 @@ public class SignData { * * @returnThe sign of this sign colors object
*/ + @NotNull public Sign getSign() { return sign; } @@ -44,6 +46,7 @@ public class SignData { * * @returnThe main color of the sign
*/ + @NotNull public ChatColor getMainSignColor() { if (dyedColor != DyeColor.BLACK) { return ColorHelper.fromColor(dyedColor.getColor()); @@ -57,6 +60,7 @@ public class SignData { * * @returnThe highlighting color of the sign
*/ + @NotNull public ChatColor getHighlightSignColor() { if (dyedColor != DyeColor.BLACK) { return ColorHelper.fromColor(ColorHelper.invert(dyedColor.getColor())); diff --git a/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java index 5b64a14..83328ac 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateAccessEvent.java @@ -24,7 +24,7 @@ public class StargateAccessEvent extends StargatePlayerEvent { * @param portalThe portal involved in the event
* @param denyWhether the stargate access should be denied
*/ - public StargateAccessEvent(Player player, Portal portal, boolean deny) { + public StargateAccessEvent(@NotNull Player player, @NotNull Portal portal, boolean deny) { super(portal, player); this.deny = deny; @@ -53,6 +53,7 @@ public class StargateAccessEvent extends StargatePlayerEvent { * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java index 3d09661..6509d90 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateActivateEvent.java @@ -28,7 +28,8 @@ public class StargateActivateEvent extends StargatePlayerEvent { * @param destinationsThe destinations available to the player using the portal
* @param destinationThe currently selected destination
*/ - public StargateActivateEvent(Portal portal, Player player, ListThe destinations available for the portal
*/ + @NotNull public ListThe new list of available destinations
*/ - public void setDestinations(ListThe selected destination
*/ + @NotNull public String getDestination() { return destination; } @@ -67,7 +70,7 @@ public class StargateActivateEvent extends StargatePlayerEvent { * * @param destinationThe new selected destination
*/ - public void setDestination(String destination) { + public void setDestination(@NotNull String destination) { this.destination = destination; } @@ -76,6 +79,7 @@ public class StargateActivateEvent extends StargatePlayerEvent { * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java index 3f2ff07..2a00e52 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateCloseEvent.java @@ -22,7 +22,7 @@ public class StargateCloseEvent extends StargateEvent { * @param portalThe portal to close
* @param forceWhether to force the gate to close, even if set as always-on
*/ - public StargateCloseEvent(Portal portal, boolean force) { + public StargateCloseEvent(@NotNull Portal portal, boolean force) { super(portal); this.force = force; @@ -51,6 +51,7 @@ public class StargateCloseEvent extends StargateEvent { * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java index 1f66e60..20b58c1 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateCreateEvent.java @@ -29,7 +29,8 @@ public class StargateCreateEvent extends StargatePlayerEvent { * @param denyReasonThe reason stargate creation was denied
* @param costThe cost of creating the new star gate
*/ - public StargateCreateEvent(Player player, Portal portal, String[] lines, boolean deny, String denyReason, int cost) { + public StargateCreateEvent(@NotNull Player player, @NotNull Portal portal, @NotNull String[] lines, boolean deny, + @NotNull String denyReason, int cost) { super(portal, player); this.lines = lines; this.deny = deny; @@ -44,6 +45,7 @@ public class StargateCreateEvent extends StargatePlayerEvent { * @returnThe text on the given line
* @throws IndexOutOfBoundsExceptionIf given a line index less than zero or above three
*/ + @NotNull public String getLine(int index) throws IndexOutOfBoundsException { return lines[index]; } @@ -71,6 +73,7 @@ public class StargateCreateEvent extends StargatePlayerEvent { * * @returnThe reason the stargate creation was denied
*/ + @NotNull public String getDenyReason() { return denyReason; } @@ -80,7 +83,7 @@ public class StargateCreateEvent extends StargatePlayerEvent { * * @param denyReasonThe new reason why the stargate creation was denied
*/ - public void setDenyReason(String denyReason) { + public void setDenyReason(@NotNull String denyReason) { this.denyReason = denyReason; } @@ -107,6 +110,7 @@ public class StargateCreateEvent extends StargatePlayerEvent { * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java index 3314ac1..c81e901 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateDeactivateEvent.java @@ -20,7 +20,7 @@ public class StargateDeactivateEvent extends StargateEvent { * * @param portalThe portal which was deactivated
*/ - public StargateDeactivateEvent(Portal portal) { + public StargateDeactivateEvent(@NotNull Portal portal) { super(portal); } @@ -29,6 +29,7 @@ public class StargateDeactivateEvent extends StargateEvent { * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java index bfcc606..3e9a6f5 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateDestroyEvent.java @@ -27,7 +27,8 @@ public class StargateDestroyEvent extends StargatePlayerEvent { * @param denyMsgThe message to display if the event is denied
* @param costThe cost of destroying the portal
*/ - public StargateDestroyEvent(Portal portal, Player player, boolean deny, String denyMsg, int cost) { + public StargateDestroyEvent(@NotNull Portal portal, @NotNull Player player, boolean deny, @NotNull String denyMsg, + int cost) { super(portal, player); this.deny = deny; this.denyReason = denyMsg; @@ -57,6 +58,7 @@ public class StargateDestroyEvent extends StargatePlayerEvent { * * @returnThe reason the event was denied
*/ + @NotNull public String getDenyReason() { return denyReason; } @@ -66,7 +68,7 @@ public class StargateDestroyEvent extends StargatePlayerEvent { * * @param denyReasonThe reason the event was denied
*/ - public void setDenyReason(String denyReason) { + public void setDenyReason(@NotNull String denyReason) { this.denyReason = denyReason; } @@ -93,6 +95,7 @@ public class StargateDestroyEvent extends StargatePlayerEvent { * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateEntityPortalEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateEntityPortalEvent.java index cd34504..5f4a4a1 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateEntityPortalEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateEntityPortalEvent.java @@ -27,7 +27,8 @@ public class StargateEntityPortalEvent extends StargateEvent implements Stargate * @param destinationThe destination the entity should exit from
* @param exitThe exit location of the destination portal the entity will be teleported to
*/ - public StargateEntityPortalEvent(Entity travellingEntity, Portal portal, Portal destination, Location exit) { + public StargateEntityPortalEvent(@NotNull Entity travellingEntity, @NotNull Portal portal, + @NotNull Portal destination, @NotNull Location exit) { super(portal); this.travellingEntity = travellingEntity; @@ -40,6 +41,7 @@ public class StargateEntityPortalEvent extends StargateEvent implements Stargate * * @returnThe non-player teleporting
*/ + @NotNull public Entity getEntity() { return travellingEntity; } @@ -49,6 +51,7 @@ public class StargateEntityPortalEvent extends StargateEvent implements Stargate * * @returnThe destination portal
*/ + @NotNull public Portal getDestination() { return destination; } @@ -59,6 +62,7 @@ public class StargateEntityPortalEvent extends StargateEvent implements Stargate * @returnLocation of the exit point
*/ @Override + @NotNull public Location getExit() { return exit; } @@ -68,7 +72,7 @@ public class StargateEntityPortalEvent extends StargateEvent implements Stargate * * @param locationThe new location of the entity's exit point
*/ - public void setExit(Location location) { + public void setExit(@NotNull Location location) { this.exit = location; } @@ -77,6 +81,7 @@ public class StargateEntityPortalEvent extends StargateEvent implements Stargate * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateEvent.java index f67a388..911937f 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateEvent.java @@ -3,6 +3,7 @@ package net.knarcraft.stargate.event; import net.knarcraft.stargate.portal.Portal; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; +import org.jetbrains.annotations.NotNull; /** * An abstract event describing any stargate event @@ -18,7 +19,7 @@ public abstract class StargateEvent extends Event implements Cancellable { * * @param portalThe portal involved in this stargate event
*/ - StargateEvent(Portal portal) { + StargateEvent(@NotNull Portal portal) { this.portal = portal; this.cancelled = false; } @@ -28,6 +29,7 @@ public abstract class StargateEvent extends Event implements Cancellable { * * @returnThe portal involved in this stargate event
*/ + @NotNull public Portal getPortal() { return portal; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java index ce10534..0767f05 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateOpenEvent.java @@ -4,6 +4,7 @@ import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * This event should be called whenever a player opens a stargate @@ -23,7 +24,7 @@ public class StargateOpenEvent extends StargatePlayerEvent { * @param portalThe opened portal
* @param forceWhether to force the portal open
*/ - public StargateOpenEvent(Player player, Portal portal, boolean force) { + public StargateOpenEvent(@Nullable Player player, @NotNull Portal portal, boolean force) { super(portal, player); this.force = force; @@ -52,6 +53,7 @@ public class StargateOpenEvent extends StargatePlayerEvent { * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java b/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java index 14514f6..ff701e4 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargatePlayerEvent.java @@ -2,6 +2,8 @@ package net.knarcraft.stargate.event; import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * An abstract event describing any stargate event where a player is involved @@ -16,7 +18,7 @@ public abstract class StargatePlayerEvent extends StargateEvent { * * @param portalThe portal involved in this stargate event
*/ - StargatePlayerEvent(Portal portal, Player player) { + StargatePlayerEvent(@NotNull Portal portal, @Nullable Player player) { super(portal); this.player = player; } @@ -26,6 +28,7 @@ public abstract class StargatePlayerEvent extends StargateEvent { * * @returnThe player creating the star gate
*/ + @Nullable public Player getPlayer() { return player; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargatePlayerPortalEvent.java b/src/main/java/net/knarcraft/stargate/event/StargatePlayerPortalEvent.java index 3d2526a..6bb4f88 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargatePlayerPortalEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargatePlayerPortalEvent.java @@ -26,7 +26,8 @@ public class StargatePlayerPortalEvent extends StargatePlayerEvent implements St * @param destinationThe destination the player should exit from
* @param exitThe exit location of the destination portal the user will be teleported to
*/ - public StargatePlayerPortalEvent(Player player, Portal portal, Portal destination, Location exit) { + public StargatePlayerPortalEvent(@NotNull Player player, @NotNull Portal portal, @NotNull Portal destination, + @NotNull Location exit) { super(portal, player); this.destination = destination; @@ -38,6 +39,7 @@ public class StargatePlayerPortalEvent extends StargatePlayerEvent implements St * * @returnThe destination portal
*/ + @NotNull public Portal getDestination() { return destination; } @@ -48,6 +50,7 @@ public class StargatePlayerPortalEvent extends StargatePlayerEvent implements St * @returnLocation of the exit point
*/ @Override + @NotNull public Location getExit() { return exit; } @@ -57,7 +60,7 @@ public class StargatePlayerPortalEvent extends StargatePlayerEvent implements St * * @param locationThe new location of the player's exit point
*/ - public void setExit(Location location) { + public void setExit(@NotNull Location location) { this.exit = location; } @@ -66,6 +69,7 @@ public class StargatePlayerPortalEvent extends StargatePlayerEvent implements St * * @returnA handler-list with all event handlers
*/ + @NotNull public static HandlerList getHandlerList() { return handlers; } diff --git a/src/main/java/net/knarcraft/stargate/event/StargateTeleportEvent.java b/src/main/java/net/knarcraft/stargate/event/StargateTeleportEvent.java index e440828..35bef4e 100644 --- a/src/main/java/net/knarcraft/stargate/event/StargateTeleportEvent.java +++ b/src/main/java/net/knarcraft/stargate/event/StargateTeleportEvent.java @@ -2,6 +2,7 @@ package net.knarcraft.stargate.event; import org.bukkit.Location; import org.bukkit.event.Cancellable; +import org.jetbrains.annotations.NotNull; /** * A generic teleportation event @@ -13,6 +14,7 @@ public interface StargateTeleportEvent extends Cancellable { * * @returnLocation of the exit point
*/ + @NotNull Location getExit(); } diff --git a/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java b/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java index f443569..25230f8 100644 --- a/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/BlockEventListener.java @@ -28,6 +28,7 @@ import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.EntityBlockFormEvent; import org.bukkit.event.block.SignChangeEvent; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -46,7 +47,7 @@ public class BlockEventListener implements Listener { * @param eventThe triggered event
*/ @EventHandler - public void onBlockFormedByEntity(EntityBlockFormEvent event) { + public void onBlockFormedByEntity(@NotNull EntityBlockFormEvent event) { if (event.isCancelled() || (!Stargate.getGateConfig().protectEntrance() && !Stargate.getGateConfig().verifyPortals())) { return; @@ -67,7 +68,7 @@ public class BlockEventListener implements Listener { * @param eventThe triggered event
*/ @EventHandler - public void onSignChange(SignChangeEvent event) { + public void onSignChange(@NotNull SignChangeEvent event) { if (event.isCancelled()) { return; } @@ -98,7 +99,7 @@ public class BlockEventListener implements Listener { } @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockPlace(BlockPlaceEvent event) { + public void onBlockPlace(@NotNull BlockPlaceEvent event) { if (event.isCancelled() || !Stargate.getGateConfig().protectEntrance()) { return; } @@ -119,7 +120,7 @@ public class BlockEventListener implements Listener { * @param eventThe triggered event
*/ @EventHandler(priority = EventPriority.HIGHEST) - public void onBlockBreak(BlockBreakEvent event) { + public void onBlockBreak(@NotNull BlockBreakEvent event) { if (event.isCancelled()) { return; } @@ -182,8 +183,8 @@ public class BlockEventListener implements Listener { * @param eventThe break event
* @returnTrue if the payment was successful. False if the event was cancelled
*/ - private boolean handleEconomyPayment(StargateDestroyEvent destroyEvent, Player player, Portal portal, - BlockBreakEvent event) { + private boolean handleEconomyPayment(@NotNull StargateDestroyEvent destroyEvent, @NotNull Player player, + @NotNull Portal portal, @NotNull BlockBreakEvent event) { int cost = destroyEvent.getCost(); if (cost != 0) { String portalName = portal.getName(); @@ -210,7 +211,7 @@ public class BlockEventListener implements Listener { * @param eventThe event to check and possibly cancel
*/ @EventHandler - public void onBlockPhysics(BlockPhysicsEvent event) { + public void onBlockPhysics(@NotNull BlockPhysicsEvent event) { Block block = event.getBlock(); Portal portal = null; @@ -230,7 +231,7 @@ public class BlockEventListener implements Listener { * @param eventThe event to check and possibly cancel
*/ @EventHandler - public void onBlockFromTo(BlockFromToEvent event) { + public void onBlockFromTo(@NotNull BlockFromToEvent event) { Portal portal = PortalHandler.getByEntrance(event.getBlock()); if (portal != null) { @@ -244,7 +245,7 @@ public class BlockEventListener implements Listener { * @param eventThe event to check and possibly cancel
*/ @EventHandler - public void onPistonExtend(BlockPistonExtendEvent event) { + public void onPistonExtend(@NotNull BlockPistonExtendEvent event) { cancelPistonEvent(event, event.getBlocks()); } @@ -254,7 +255,7 @@ public class BlockEventListener implements Listener { * @param eventThe event to check and possibly cancel
*/ @EventHandler - public void onPistonRetract(BlockPistonRetractEvent event) { + public void onPistonRetract(@NotNull BlockPistonRetractEvent event) { if (!event.isSticky()) { return; } @@ -267,7 +268,7 @@ public class BlockEventListener implements Listener { * @param eventThe event to cancel
* @param blocksThe blocks included in the event
*/ - private void cancelPistonEvent(BlockPistonEvent event, ListThe event to check and possibly cancel
*/ @EventHandler(priority = EventPriority.LOWEST) - public void onPortalEvent(EntityPortalEvent event) { + public void onPortalEvent(@NotNull EntityPortalEvent event) { if (event.isCancelled()) { return; } @@ -46,7 +47,7 @@ public class EntityEventListener implements Listener { * @param eventThe triggered explosion event
*/ @EventHandler - public void onEntityExplode(EntityExplodeEvent event) { + public void onEntityExplode(@NotNull EntityExplodeEvent event) { if (event.isCancelled()) { return; } diff --git a/src/main/java/net/knarcraft/stargate/listener/EntitySpawnListener.java b/src/main/java/net/knarcraft/stargate/listener/EntitySpawnListener.java index b4c0b2c..f806e6c 100644 --- a/src/main/java/net/knarcraft/stargate/listener/EntitySpawnListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/EntitySpawnListener.java @@ -5,6 +5,7 @@ import net.knarcraft.stargate.portal.PortalHandler; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.CreatureSpawnEvent; +import org.jetbrains.annotations.NotNull; /** * A listener that listens for any relevant events causing entities to spawn @@ -12,13 +13,12 @@ import org.bukkit.event.entity.CreatureSpawnEvent; public class EntitySpawnListener implements Listener { @EventHandler - public void onCreatureSpawn(CreatureSpawnEvent event) { + public void onCreatureSpawn(@NotNull CreatureSpawnEvent event) { //Prevent Zombified Piglins and other creatures form spawning at stargates - if (event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NETHER_PORTAL) { - if (PortalHandler.getByEntrance(event.getLocation()) != null) { - event.setCancelled(true); - Stargate.debug("EntitySpawnListener", "Prevented creature from spawning at Stargate"); - } + if (event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NETHER_PORTAL && + PortalHandler.getByEntrance(event.getLocation()) != null) { + event.setCancelled(true); + Stargate.debug("EntitySpawnListener", "Prevented creature from spawning at Stargate"); } } diff --git a/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java b/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java index 6fd69b0..4720def 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java @@ -35,6 +35,8 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -53,7 +55,7 @@ public class PlayerEventListener implements Listener { * @param eventThe event to check for a teleporting player
*/ @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { + public void onPlayerJoin(@NotNull PlayerJoinEvent event) { Player player = event.getPlayer(); //Migrate player name to UUID if necessary UUIDMigrationHelper.migrateUUID(player); @@ -91,7 +93,7 @@ public class PlayerEventListener implements Listener { * @param eventThe player move event which was triggered
*/ @EventHandler - public void onPlayerMove(PlayerMoveEvent event) { + public void onPlayerMove(@NotNull PlayerMoveEvent event) { if (event.isCancelled() || event.getTo() == null) { return; } @@ -108,9 +110,16 @@ public class PlayerEventListener implements Listener { //Check an additional block away in case the portal is a bungee portal using END_PORTAL if (entrancePortal == null) { entrancePortal = PortalHandler.getByAdjacentEntrance(toLocation); + // This should never realistically be null + if (entrancePortal == null) { + return; + } } Portal destination = entrancePortal.getPortalActivator().getDestination(player); + if (destination == null) { + return; + } Entity playerVehicle = player.getVehicle(); //If the player is in a vehicle, but vehicle handling is disabled, just ignore the player @@ -129,8 +138,8 @@ public class PlayerEventListener implements Listener { * @param destinationThe destination of the entrance portal
* @param eventThe move event causing the teleportation to trigger
*/ - private void teleportPlayer(Entity playerVehicle, Player player, Portal entrancePortal, Portal destination, - PlayerMoveEvent event) { + private void teleportPlayer(@Nullable Entity playerVehicle, @NotNull Player player, @NotNull Portal entrancePortal, + @NotNull Portal destination, @NotNull PlayerMoveEvent event) { if (playerVehicle instanceof LivingEntity) { //Make sure any horses are properly tamed if (playerVehicle instanceof AbstractHorse horse && !horse.isTamed()) { @@ -159,8 +168,8 @@ public class PlayerEventListener implements Listener { * @param toLocationThe location the player is moving to
* @returnTrue if the event is relevant
*/ - private boolean isRelevantMoveEvent(PlayerMoveEvent event, Player player, BlockLocation fromLocation, - BlockLocation toLocation) { + private boolean isRelevantMoveEvent(@NotNull PlayerMoveEvent event, Player player, + @NotNull BlockLocation fromLocation, @NotNull BlockLocation toLocation) { //Check to see if the player moved to another block if (fromLocation.equals(toLocation)) { return false; @@ -207,7 +216,7 @@ public class PlayerEventListener implements Listener { * @param eventThe player interact event which was triggered
*/ @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { + public void onPlayerInteract(@NotNull PlayerInteractEvent event) { Player player = event.getPlayer(); Block block = event.getClickedBlock(); @@ -216,6 +225,10 @@ public class PlayerEventListener implements Listener { } if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { + if (event.getHand() == null) { + return; + } + // Handle right-click of a sign, button or other handleRightClickBlock(event, player, block, event.getHand()); } else if (event.getAction() == Action.LEFT_CLICK_BLOCK && block.getBlockData() instanceof WallSign) { //Handle left click of a wall sign @@ -231,7 +244,8 @@ public class PlayerEventListener implements Listener { * @param blockThe block that was clicked
* @param leftClickWhether the player performed a left click as opposed to a right click
*/ - private void handleSignClick(PlayerInteractEvent event, Player player, Block block, boolean leftClick) { + private void handleSignClick(@NotNull PlayerInteractEvent event, @NotNull Player player, @NotNull Block block, + boolean leftClick) { Portal portal = PortalHandler.getByBlock(block); if (portal == null) { return; @@ -286,7 +300,7 @@ public class PlayerEventListener implements Listener { * @param portalThe portal the player is trying to use
* @returnTrue if the player should be denied
*/ - private boolean cannotAccessPortal(Player player, Portal portal) { + private boolean cannotAccessPortal(@NotNull Player player, @NotNull Portal portal) { boolean deny = PermissionHelper.cannotAccessNetwork(player, portal.getCleanNetwork()); if (PermissionHelper.portalAccessDenied(player, portal, deny)) { @@ -306,7 +320,8 @@ public class PlayerEventListener implements Listener { * @param blockThe block the player clicked
* @param handThe hand the player used to interact with the stargate
*/ - private void handleRightClickBlock(PlayerInteractEvent event, Player player, Block block, EquipmentSlot hand) { + private void handleRightClickBlock(@NotNull PlayerInteractEvent event, @NotNull Player player, @NotNull Block block, + @NotNull EquipmentSlot hand) { if (block.getBlockData() instanceof WallSign) { handleSignClick(event, player, block, false); return; @@ -353,7 +368,7 @@ public class PlayerEventListener implements Listener { * @param blockThe clicked block
* @param playerThe player that clicked the block
*/ - private void displayPortalInfo(Block block, Player player) { + private void displayPortalInfo(@NotNull Block block, @NotNull Player player) { Portal portal = PortalHandler.getByBlock(block); if (portal == null) { return; @@ -363,15 +378,15 @@ public class PlayerEventListener implements Listener { if (portal.getOptions().hasNoSign() && (!portal.getOptions().isSilent() || player.isSneaking())) { MessageSender sender = Stargate.getMessageSender(); sender.sendSuccessMessage(player, ChatColor.GOLD + Stargate.getString("portalInfoTitle")); - sender.sendSuccessMessage(player, Stargate.replaceVars(Stargate.getString("portalInfoName"), + sender.sendSuccessMessage(player, Stargate.replacePlaceholders(Stargate.getString("portalInfoName"), "%name%", portal.getName())); - sender.sendSuccessMessage(player, Stargate.replaceVars(Stargate.getString("portalInfoDestination"), + sender.sendSuccessMessage(player, Stargate.replacePlaceholders(Stargate.getString("portalInfoDestination"), "%destination%", portal.getDestinationName())); if (portal.getOptions().isBungee()) { - sender.sendSuccessMessage(player, Stargate.replaceVars(Stargate.getString("portalInfoServer"), + sender.sendSuccessMessage(player, Stargate.replacePlaceholders(Stargate.getString("portalInfoServer"), "%server%", portal.getNetwork())); } else { - sender.sendSuccessMessage(player, Stargate.replaceVars(Stargate.getString("portalInfoNetwork"), + sender.sendSuccessMessage(player, Stargate.replacePlaceholders(Stargate.getString("portalInfoNetwork"), "%network%", portal.getNetwork())); } } @@ -388,7 +403,7 @@ public class PlayerEventListener implements Listener { * @param blockThe block to check
* @returnTrue if the click is a bug and should be cancelled
*/ - private boolean clickIsBug(Player player, Block block) { + private boolean clickIsBug(@NotNull Player player, @NotNull Block block) { Long previousEventTime = previousEventTimes.get(player); if (previousEventTime != null && previousEventTime + 50 > System.currentTimeMillis()) { previousEventTimes.put(player, null); diff --git a/src/main/java/net/knarcraft/stargate/listener/PluginEventListener.java b/src/main/java/net/knarcraft/stargate/listener/PluginEventListener.java index 2f70de3..d675335 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PluginEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PluginEventListener.java @@ -5,6 +5,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; /** * This listener listens for any plugins being enabled or disabled to catch the loading of vault @@ -19,7 +21,7 @@ public class PluginEventListener implements Listener { * * @param stargateA reference to the stargate plugin to
*/ - public PluginEventListener(Stargate stargate) { + public PluginEventListener(@NotNull Stargate stargate) { this.stargate = stargate; } @@ -31,10 +33,14 @@ public class PluginEventListener implements Listener { * @param ignoredThe actual event called. This is currently not used
*/ @EventHandler - public void onPluginEnable(PluginEnableEvent ignored) { + public void onPluginEnable(@NotNull PluginEnableEvent ignored) { if (Stargate.getEconomyConfig().setupEconomy(stargate.getServer().getPluginManager())) { - String vaultVersion = Stargate.getEconomyConfig().getVault().getDescription().getVersion(); - Stargate.logInfo(Stargate.replaceVars(Stargate.getString("vaultLoaded"), "%version%", vaultVersion)); + Plugin vault = Stargate.getEconomyConfig().getVault(); + if (vault != null) { + String vaultVersion = vault.getDescription().getVersion(); + Stargate.logInfo(Stargate.replacePlaceholders(Stargate.getString("vaultLoaded"), "%version%", + vaultVersion)); + } } } @@ -44,7 +50,7 @@ public class PluginEventListener implements Listener { * @param eventThe event caused by disabling a plugin
*/ @EventHandler - public void onPluginDisable(PluginDisableEvent event) { + public void onPluginDisable(@NotNull PluginDisableEvent event) { if (event.getPlugin().equals(Stargate.getEconomyConfig().getVault())) { Stargate.logInfo("Vault plugin lost."); } diff --git a/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java b/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java index c81640f..41d2d9b 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java @@ -17,16 +17,17 @@ import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityPortalEnterEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.world.PortalCreateEvent; +import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; +import java.util.HashMap; +import java.util.Map; /** * Listens for and cancels relevant portal events */ public class PortalEventListener implements Listener { - private static final ListThe triggered event
*/ @EventHandler - public void onPortalCreation(PortalCreateEvent event) { + public void onPortalCreation(@NotNull PortalCreateEvent event) { if (event.isCancelled()) { return; } @@ -56,32 +57,37 @@ public class PortalEventListener implements Listener { * @param eventThe triggered event
*/ @EventHandler - public void onEntityPortalEnter(EntityPortalEnterEvent event) { + public void onEntityPortalEnter(@NotNull EntityPortalEnterEvent event) { Location location = event.getLocation(); World world = location.getWorld(); Entity entity = event.getEntity(); - //Hijack normal portal teleportation if teleporting from a stargate - if (entity instanceof Player player && location.getBlock().getType() == Material.END_PORTAL && world != null && - world.getEnvironment() == World.Environment.THE_END) { - Portal portal = PortalHandler.getByAdjacentEntrance(location); - if (portal == null) { - return; - } + //Hijack normal portal teleportation if teleporting from a stargate, and teleporting from an end portal in the + // end + if (!(entity instanceof Player player) || location.getBlock().getType() != Material.END_PORTAL || + world == null || world.getEnvironment() != World.Environment.THE_END) { + return; + } + + Portal portal = PortalHandler.getByAdjacentEntrance(location); + if (portal == null) { + return; + } + + Stargate.debug("PortalEventListener::onEntityPortalEnter", + "Found player " + player + " entering END_PORTAL " + portal); + + //Decide if the anything stops the player from teleporting + if (PermissionHelper.playerCannotTeleport(portal, portal.getPortalActivator().getDestination(), + player, null) || portal.getOptions().isBungee()) { + //Teleport the player back to the portal they came in, just in case + playersFromTheEnd.put(player, new FromTheEndTeleportation(portal)); Stargate.debug("PortalEventListener::onEntityPortalEnter", - "Found player " + player + " entering END_PORTAL " + portal); - - //Remove any old player teleportations in case weird things happen - playersFromTheEnd.removeIf((teleportation -> teleportation.getPlayer() == player)); - //Decide if the anything stops the player from teleporting - if (PermissionHelper.playerCannotTeleport(portal, portal.getPortalActivator().getDestination(), player, null) || - portal.getOptions().isBungee()) { - //Teleport the player back to the portal they came in, just in case - playersFromTheEnd.add(new FromTheEndTeleportation(player, portal)); - Stargate.debug("PortalEventListener::onEntityPortalEnter", - "Sending player back to the entrance"); - } else { - playersFromTheEnd.add(new FromTheEndTeleportation(player, portal.getPortalActivator().getDestination())); + "Sending player back to the entrance"); + } else { + Portal destination = portal.getPortalActivator().getDestination(); + if (destination != null) { + playersFromTheEnd.put(player, new FromTheEndTeleportation(destination)); Stargate.debug("PortalEventListener::onEntityPortalEnter", "Sending player to destination"); } @@ -94,16 +100,11 @@ public class PortalEventListener implements Listener { * @param eventThe triggered event
*/ @EventHandler - public void onRespawn(PlayerRespawnEvent event) { + public void onRespawn(@NotNull PlayerRespawnEvent event) { Player respawningPlayer = event.getPlayer(); - int playerIndex = playersFromTheEnd.indexOf(new FromTheEndTeleportation(respawningPlayer, null)); - if (playerIndex == -1) { - return; - } - FromTheEndTeleportation teleportation = playersFromTheEnd.get(playerIndex); - playersFromTheEnd.remove(playerIndex); + FromTheEndTeleportation teleportation = playersFromTheEnd.remove(respawningPlayer); + Portal exitPortal = teleportation.exitPortal(); - Portal exitPortal = teleportation.getExit(); //Overwrite respawn location to respawn in front of the portal PlayerTeleporter teleporter = new PlayerTeleporter(exitPortal, respawningPlayer); Location respawnLocation = teleporter.getExit(); diff --git a/src/main/java/net/knarcraft/stargate/listener/TeleportEventListener.java b/src/main/java/net/knarcraft/stargate/listener/TeleportEventListener.java index 21a0118..34ab7a6 100644 --- a/src/main/java/net/knarcraft/stargate/listener/TeleportEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/TeleportEventListener.java @@ -4,6 +4,7 @@ import net.knarcraft.stargate.portal.PortalHandler; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerTeleportEvent; +import org.jetbrains.annotations.NotNull; /** * This listener listens to teleportation-related events @@ -21,7 +22,7 @@ public class TeleportEventListener implements Listener { * @param eventThe event to check and possibly cancel
*/ @EventHandler - public void onPlayerTeleport(PlayerTeleportEvent event) { + public void onPlayerTeleport(@NotNull PlayerTeleportEvent event) { PlayerTeleportEvent.TeleportCause cause = event.getCause(); //Block normal portal teleportation if teleporting from a stargate diff --git a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java index 42c1102..f2ecb6a 100644 --- a/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/VehicleEventListener.java @@ -13,6 +13,7 @@ import org.bukkit.entity.Vehicle; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.vehicle.VehicleMoveEvent; +import org.jetbrains.annotations.NotNull; import java.util.List; @@ -28,7 +29,7 @@ public class VehicleEventListener implements Listener { * @param eventThe triggered move event
*/ @EventHandler - public void onVehicleMove(VehicleMoveEvent event) { + public void onVehicleMove(@NotNull VehicleMoveEvent event) { if (!Stargate.getGateConfig().handleVehicles()) { return; } @@ -58,7 +59,8 @@ public class VehicleEventListener implements Listener { * @param entrancePortalThe portal the vehicle is entering
* @param vehicleThe vehicle passing through
*/ - private static void teleportVehicle(ListThe portal the minecart entered
* @param vehicleThe vehicle to teleport
*/ - private static void teleportPlayerAndVehicle(Portal entrancePortal, Vehicle vehicle) { + private static void teleportPlayerAndVehicle(@NotNull Portal entrancePortal, @NotNull Vehicle vehicle) { Entity rootEntity = vehicle; while (rootEntity.getVehicle() != null) { rootEntity = rootEntity.getVehicle(); @@ -101,6 +103,7 @@ public class VehicleEventListener implements Listener { Portal possibleDestinationPortal = entrancePortal.getPortalActivator().getDestination(player); if (possibleDestinationPortal != null) { destinationPortal = possibleDestinationPortal; + break; } } @@ -116,7 +119,7 @@ public class VehicleEventListener implements Listener { cancelTeleport = true; } } - if (cancelTeleport) { + if (cancelTeleport || destinationPortal == null) { return; } diff --git a/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java b/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java index 6329d6d..5606e80 100644 --- a/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/WorldEventListener.java @@ -9,6 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.event.world.WorldUnloadEvent; +import org.jetbrains.annotations.NotNull; /** * This listener listens for the loading and unloading of worlds to load and unload stargates @@ -22,7 +23,7 @@ public class WorldEventListener implements Listener { * @param eventThe triggered world load event
*/ @EventHandler - public void onWorldLoad(WorldLoadEvent event) { + public void onWorldLoad(@NotNull WorldLoadEvent event) { StargateConfig config = Stargate.getStargateConfig(); if (!config.getManagedWorlds().contains(event.getWorld().getName()) && PortalFileHelper.loadAllPortals(event.getWorld())) { @@ -36,7 +37,7 @@ public class WorldEventListener implements Listener { * @param eventThe triggered world unload event
*/ @EventHandler - public void onWorldUnload(WorldUnloadEvent event) { + public void onWorldUnload(@NotNull WorldUnloadEvent event) { Stargate.debug("onWorldUnload", "Reloading all Stargates"); World world = event.getWorld(); String worldName = world.getName(); diff --git a/src/main/java/net/knarcraft/stargate/portal/Portal.java b/src/main/java/net/knarcraft/stargate/portal/Portal.java index f42ddb2..304136e 100644 --- a/src/main/java/net/knarcraft/stargate/portal/Portal.java +++ b/src/main/java/net/knarcraft/stargate/portal/Portal.java @@ -11,6 +11,8 @@ import net.knarcraft.stargate.portal.property.gate.Gate; import net.md_5.bungee.api.ChatColor; import org.bukkit.World; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Map; @@ -46,8 +48,9 @@ public class Portal { * @param portalOwnerThe portal's owner
* @param optionsA map containing all possible portal options, with true for the ones enabled
*/ - public Portal(PortalLocation portalLocation, BlockLocation button, String destination, String name, String network, - Gate gate, PortalOwner portalOwner, MapThis portal's location data
*/ + @NotNull public PortalLocation getLocation() { return this.location; } @@ -96,6 +100,7 @@ public class Portal { * * @returnThis portal's structure
*/ + @NotNull public PortalStructure getStructure() { return this.structure; } @@ -108,6 +113,7 @@ public class Portal { * * @returnThis portal's activator
*/ + @NotNull public PortalActivator getPortalActivator() { return this.portalActivator; } @@ -124,6 +130,7 @@ public class Portal { * * @returnThis portal's portal options
*/ + @NotNull public PortalOptions getOptions() { return this.options; } @@ -142,6 +149,7 @@ public class Portal { * * @returnThe player currently using this portal
*/ + @Nullable public Player getActivePlayer() { return portalActivator.getActivePlayer(); } @@ -151,6 +159,7 @@ public class Portal { * * @returnThe network this portal belongs to
*/ + @NotNull public String getNetwork() { return network; } @@ -160,6 +169,7 @@ public class Portal { * * @returnThe clean network name
*/ + @NotNull public String getCleanNetwork() { return cleanNetwork; } @@ -181,6 +191,7 @@ public class Portal { * * @returnThe name of this portal
*/ + @NotNull public String getName() { return name; } @@ -190,6 +201,7 @@ public class Portal { * * @returnThe clean name of this portal
*/ + @NotNull public String getCleanName() { return cleanName; } @@ -201,6 +213,7 @@ public class Portal { * * @returnThis portal's portal opener
*/ + @NotNull public PortalOpener getPortalOpener() { return portalOpener; } @@ -210,6 +223,7 @@ public class Portal { * * @returnThe name of this portal's destination portal
*/ + @NotNull public String getDestinationName() { return portalOpener.getPortalActivator().getDestinationName(); } @@ -219,6 +233,7 @@ public class Portal { * * @returnThe gate type used by this portal
*/ + @NotNull public Gate getGate() { return structure.getGate(); } @@ -230,6 +245,7 @@ public class Portal { * * @returnThis portal's owner
*/ + @NotNull public PortalOwner getOwner() { return portalOwner; } @@ -240,7 +256,7 @@ public class Portal { * @param playerThe player to check
* @returnTrue if the player is the owner of this portal
*/ - public boolean isOwner(Player player) { + public boolean isOwner(@NotNull Player player) { if (this.portalOwner.getUUID() != null) { return player.getUniqueId().compareTo(this.portalOwner.getUUID()) == 0; } else { @@ -253,6 +269,7 @@ public class Portal { * * @returnThe world this portal belongs to
*/ + @Nullable public World getWorld() { return location.getWorld(); } @@ -262,6 +279,7 @@ public class Portal { * * @returnThe location of this portal's sign
*/ + @NotNull public BlockLocation getSignLocation() { return this.location.getSignLocation(); } @@ -283,6 +301,7 @@ public class Portal { * * @returnThe location of the top-left portal block
*/ + @NotNull public BlockLocation getTopLeft() { return this.location.getTopLeft(); } @@ -293,7 +312,8 @@ public class Portal { * @param vectorThe relative block vector explaining the position of the block
* @returnThe block at the given relative position
*/ - public BlockLocation getBlockAt(RelativeBlockVector vector) { + @NotNull + public BlockLocation getBlockAt(@NotNull RelativeBlockVector vector) { return getTopLeft().getRelativeLocation(vector, getYaw()); } @@ -303,11 +323,13 @@ public class Portal { * @param stringThe string to clean
* @returnThe clean string
*/ - public static String cleanString(String string) { + @NotNull + public static String cleanString(@NotNull String string) { return ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', string)).toLowerCase(); } @Override + @NotNull public String toString() { return String.format("Portal [id=%s, network=%s name=%s, type=%s]", getSignLocation(), network, name, structure.getGate().getFilename()); @@ -323,7 +345,7 @@ public class Portal { } @Override - public boolean equals(Object object) { + public boolean equals(@Nullable Object object) { if (this == object) { return true; } diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalActivator.java b/src/main/java/net/knarcraft/stargate/portal/PortalActivator.java index c0fd01e..55878f8 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalActivator.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalActivator.java @@ -4,6 +4,8 @@ import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.event.StargateActivateEvent; import net.knarcraft.stargate.event.StargateDeactivateEvent; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; @@ -33,7 +35,7 @@ public class PortalActivator { * @param portalOpenerThe portal opener to trigger when the activation causes the portal to open
* @param destinationThe fixed destination specified on the portal's sign
*/ - public PortalActivator(Portal portal, PortalOpener portalOpener, String destination) { + public PortalActivator(@NotNull Portal portal, @NotNull PortalOpener portalOpener, @NotNull String destination) { this.portal = portal; this.opener = portalOpener; this.destination = destination; @@ -44,6 +46,7 @@ public class PortalActivator { * * @returnThe player this activator's portal is currently activated for
*/ + @NotNull public Player getActivePlayer() { return activePlayer; } @@ -53,6 +56,7 @@ public class PortalActivator { * * @returnThe available portal destinations
*/ + @NotNull public ListUsed for random gates to determine which destinations are available
* @returnThe destination portal the player should teleport to
*/ - public Portal getDestination(Player player) { + @Nullable + public Portal getDestination(@Nullable Player player) { String portalNetwork = portal.getCleanNetwork(); if (portal.getOptions().isRandom()) { //Find possible destinations @@ -88,6 +93,7 @@ public class PortalActivator { * * @returnThe portal destination
*/ + @Nullable public Portal getDestination() { return getDestination(null); } @@ -97,7 +103,7 @@ public class PortalActivator { * * @param destinationThe new destination of this portal activator's portal
*/ - public void setDestination(Portal destination) { + public void setDestination(@NotNull Portal destination) { setDestination(destination.getName()); } @@ -106,7 +112,7 @@ public class PortalActivator { * * @param destinationThe new destination of this portal activator's portal
*/ - public void setDestination(String destination) { + public void setDestination(@NotNull String destination) { this.destination = destination; } @@ -115,6 +121,7 @@ public class PortalActivator { * * @returnThe name of the selected destination
*/ + @NotNull public String getDestinationName() { return destination; } @@ -125,7 +132,7 @@ public class PortalActivator { * @param playerThe player to activate the portal for
* @returnTrue if the portal was activated
*/ - boolean activate(Player player) { + public boolean activate(@NotNull Player player) { //Clear previous destination data this.destination = ""; this.destinations.clear(); @@ -162,7 +169,7 @@ public class PortalActivator { * @param playerThe player trying to activate this activator's portal
* @returnTrue if the portal was activated. False otherwise
*/ - private boolean triggerStargateActivationEvent(Player player) { + private boolean triggerStargateActivationEvent(@NotNull Player player) { StargateActivateEvent event = new StargateActivateEvent(portal, player, destinations, destination); Stargate.getInstance().getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -217,7 +224,7 @@ public class PortalActivator { * * @param playerThe player to cycle the gate for
*/ - public void cycleDestination(Player player) { + public void cycleDestination(@NotNull Player player) { cycleDestination(player, 1); } @@ -227,7 +234,7 @@ public class PortalActivator { * @param playerThe player cycling destinations
* @param directionThe direction of the cycle (+1 for next, -1 for previous)
*/ - public void cycleDestination(Player player, int direction) { + public void cycleDestination(@NotNull Player player, int direction) { //Only allow going exactly one step in either direction if (direction != 1 && direction != -1) { throw new IllegalArgumentException("The destination direction must be 1 or -1."); diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalCreator.java b/src/main/java/net/knarcraft/stargate/portal/PortalCreator.java index 4ec865c..b84489e 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalCreator.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalCreator.java @@ -18,6 +18,8 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.event.block.SignChangeEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; @@ -39,7 +41,7 @@ public class PortalCreator { * @param eventThe sign change event which initialized the creation
* @param playerThe player creating the portal
*/ - public PortalCreator(SignChangeEvent event, Player player) { + public PortalCreator(@NotNull SignChangeEvent event, @NotNull Player player) { this.event = event; this.player = player; } @@ -49,12 +51,13 @@ public class PortalCreator { * * @returnThe created portal
*/ + @Nullable public Portal createPortal() { BlockLocation signLocation = new BlockLocation(event.getBlock()); Block signControlBlock = signLocation.getParent(); //Return early if the sign is not placed on a block, or the block is not a control block - if (signControlBlock == null || GateHandler.getGatesByControlBlock(signControlBlock).length == 0) { + if (signControlBlock == null || GateHandler.getGatesByControlBlock(signControlBlock).isEmpty()) { Stargate.debug("createPortal", "Control block not registered"); return null; } @@ -144,7 +147,7 @@ public class PortalCreator { //Check if the user can create portals to this world. if (!portalOptions.get(PortalOption.BUNGEE) && !deny && destinationName.length() > 0) { Portal portal = PortalHandler.getByName(destinationName, network); - if (portal != null) { + if (portal != null && portal.getWorld() != null) { String world = portal.getWorld().getName(); if (PermissionHelper.cannotAccessWorld(player, world)) { Stargate.debug("canCreateNetworkGate", "Player does not have access to destination world"); @@ -173,7 +176,8 @@ public class PortalCreator { * @param denyWhether the portal creation has already been denied
* @returnThe portal or null if its creation was denied
*/ - public Portal validatePortal(String denyMessage, String[] lines, boolean deny) { + @Nullable + public Portal validatePortal(@NotNull String denyMessage, String[] lines, boolean deny) { PortalLocation portalLocation = portal.getLocation(); Gate gate = portal.getStructure().getGate(); PortalOptions portalOptions = portal.getOptions(); @@ -219,7 +223,9 @@ public class PortalCreator { PortalHandler.updatePortalsPointingAtNewPortal(portal); } - PortalFileHelper.saveAllPortals(portal.getWorld()); + if (portal.getWorld() != null) { + PortalFileHelper.saveAllPortals(portal.getWorld()); + } return portal; } @@ -231,7 +237,7 @@ public class PortalCreator { * @param portalNameThe name of the newly created portal
* @returnTrue if the portal is completely valid
*/ - private boolean checkIfNewPortalIsValid(int cost, String portalName) { + private boolean checkIfNewPortalIsValid(int cost, @NotNull String portalName) { //Check if the portal name can fit on the sign with padding (>name<) if (portal.getCleanName().length() < 1 || portal.getCleanName().length() > getMaxNameNetworkLength()) { Stargate.debug("createPortal", String.format("Name length error. %s is too long.", @@ -282,7 +288,7 @@ public class PortalCreator { * * @param destinationNameThe name of the destination portal. Only used if set as always on
*/ - private void updateNewPortalOpenState(String destinationName) { + private void updateNewPortalOpenState(@NotNull String destinationName) { portal.drawSign(); if (portal.getOptions().isRandom() || portal.getOptions().isBungee()) { //Open the implicitly always on portal @@ -312,7 +318,8 @@ public class PortalCreator { * @param playerThe player creating the new portal
* @returnTrue if a conflict was found. False otherwise
*/ - private static boolean conflictsWithExistingPortal(Gate gate, BlockLocation topLeft, double yaw, Player player) { + private static boolean conflictsWithExistingPortal(@NotNull Gate gate, @NotNull BlockLocation topLeft, double yaw, + @NotNull Player player) { for (RelativeBlockVector borderVector : gate.getLayout().getBorder()) { BlockLocation borderBlockLocation = topLeft.getRelativeLocation(borderVector, yaw); if (PortalHandler.getByBlock(borderBlockLocation.getBlock()) != null) { diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java index 3ce9b56..caba7e3 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalHandler.java @@ -13,6 +13,8 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; @@ -33,6 +35,7 @@ public class PortalHandler { * * @returnA copy of all portal networks
*/ + @NotNull public static MapA copy of all bungee portals
*/ + @NotNull public static MapThe network to get portals from
* @returnA list of portal names
*/ + @NotNull public static ListThe network to get destinations from
* @returnAll destinations the player can go to
*/ - public static ListThe portal to register
*/ - public static void registerPortal(Portal portal) { + public static void registerPortal(@NotNull Portal portal) { PortalRegistry.registerPortal(portal); } @@ -123,8 +130,8 @@ public class PortalHandler { * @param networkThe name of the portal's network
* @returnFalse if the portal is an invalid bungee portal. True otherwise
*/ - static boolean isValidBungeePortal(MapThe world the player is located in
* @returnThe matching gate type, or null if no such gate could be found
*/ - static Gate findMatchingGate(PortalLocation portalLocation, World world) { + @Nullable + public static Gate findMatchingGate(@NotNull PortalLocation portalLocation, @NotNull World world) { Block signParent = portalLocation.getSignLocation().getParent(); + if (signParent == null) { + return null; + } BlockLocation parent = new BlockLocation(world, signParent.getX(), signParent.getY(), signParent.getZ()); //Get all gates with the used type of control blocks - Gate[] possibleGates = GateHandler.getGatesByControlBlock(signParent); + ListThe newly created portal
*/ - static void updatePortalsPointingAtNewPortal(Portal portal) { + public static void updatePortalsPointingAtNewPortal(@NotNull Portal portal) { for (String originName : PortalRegistry.getAllPortalNetworks().get(portal.getCleanNetwork())) { Portal origin = getByName(originName, portal.getCleanNetwork()); if (origin == null || @@ -214,7 +225,9 @@ public class PortalHandler { * @param optionsThe string on the option line of the sign
* @returnA map containing all portal options and their values
*/ - static MapThe network the portal is connected to
* @returnThe portal with the given name or null
*/ - public static Portal getByName(String name, String network) { + @Nullable + public static Portal getByName(@NotNull String name, @NotNull String network) { MapThe location of the portal's entrance
* @returnThe portal at the given location
*/ - public static Portal getByEntrance(Location location) { + @Nullable + public static Portal getByEntrance(@NotNull Location location) { + if (location.getWorld() == null) { + return null; + } return PortalRegistry.getLookupEntrances().get(new BlockLocation(location.getWorld(), location.getBlockX(), location.getBlockY(), location.getBlockZ())); } @@ -278,7 +296,8 @@ public class PortalHandler { * @param blockThe block at the portal's entrance
* @returnThe portal at the given block's location
*/ - public static Portal getByEntrance(Block block) { + @Nullable + public static Portal getByEntrance(@NotNull Block block) { return PortalRegistry.getLookupEntrances().get(new BlockLocation(block)); } @@ -288,7 +307,8 @@ public class PortalHandler { * @param locationA location adjacent to the portal's entrance
* @returnThe portal adjacent to the given location
*/ - public static Portal getByAdjacentEntrance(Location location) { + @Nullable + public static Portal getByAdjacentEntrance(@NotNull Location location) { return getByAdjacentEntrance(location, 1); } @@ -299,7 +319,8 @@ public class PortalHandler { * @param rangeThe range to scan for portals
* @returnThe portal adjacent to the given location
*/ - public static Portal getByAdjacentEntrance(Location location, int range) { + @Nullable + public static Portal getByAdjacentEntrance(@NotNull Location location, int range) { ListThe portal's control block
* @returnThe portal with the given control block
*/ - public static Portal getByControl(Block block) { + @Nullable + public static Portal getByControl(@NotNull Block block) { return PortalRegistry.getLookupControls().get(new BlockLocation(block)); } @@ -342,7 +364,8 @@ public class PortalHandler { * @param blockOne of the loaded lookup blocks
* @returnThe portal corresponding to the block
*/ - public static Portal getByBlock(Block block) { + @Nullable + public static Portal getByBlock(@NotNull Block block) { return PortalRegistry.getLookupBlocks().get(new BlockLocation(block)); } @@ -352,7 +375,8 @@ public class PortalHandler { * @param nameThe name of the bungee portal to get
* @returnA bungee portal
*/ - public static Portal getBungeePortal(String name) { + @Nullable + public static Portal getBungeePortal(@NotNull String name) { return PortalRegistry.getBungeePortals().get(name.toLowerCase()); } @@ -362,7 +386,8 @@ public class PortalHandler { * @param portalDataThe string list containing all information about a portal
* @returnA map between portal options and booleans
*/ - public static MapThe portal of the star portal
*/ - private static void unregisterInvalidPortal(Portal portal) { + private static void unregisterInvalidPortal(@NotNull Portal portal) { //Show debug information for (RelativeBlockVector control : portal.getGate().getLayout().getControls()) { Block block = portal.getBlockAt(control).getBlock(); @@ -447,7 +472,8 @@ public class PortalHandler { * @param inputThe name to filter
* @returnThe filtered name
*/ - public static String filterName(String input) { + @NotNull + public static String filterName(@Nullable String input) { if (input == null) { return ""; } diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java b/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java index 8390c05..77d5dcb 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalOpener.java @@ -10,6 +10,8 @@ import org.bukkit.Axis; import org.bukkit.Material; import org.bukkit.block.data.Orientable; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * The portal opener is responsible for opening and closing a portal @@ -28,7 +30,7 @@ public class PortalOpener { * @param portalThe portal this portal opener should open
* @param destinationThe fixed destination defined on the portal's sign
*/ - public PortalOpener(Portal portal, String destination) { + public PortalOpener(@NotNull Portal portal, @NotNull String destination) { this.portal = portal; this.portalActivator = new PortalActivator(portal, this, destination); } @@ -56,6 +58,7 @@ public class PortalOpener { * * @returnThe portal activator belonging to this portal opener
*/ + @NotNull public PortalActivator getPortalActivator() { return this.portalActivator; } @@ -75,7 +78,7 @@ public class PortalOpener { * @param openForThe player to open the portal for
* @param forceWhether to force the portal open, even if it's already open for some player
*/ - public void openPortal(Player openFor, boolean force) { + public void openPortal(@Nullable Player openFor, boolean force) { //Call the StargateOpenEvent to allow the opening to be cancelled StargateOpenEvent event = new StargateOpenEvent(openFor, portal, force); Stargate.getInstance().getServer().getPluginManager().callEvent(event); @@ -102,7 +105,7 @@ public class PortalOpener { * * @param openForThe player to open this portal opener's portal for
*/ - private void updatePortalOpenState(Player openFor) { + private void updatePortalOpenState(@Nullable Player openFor) { //Update the open state of this portal isOpen = true; triggeredTime = System.currentTimeMillis() / 1000; @@ -207,7 +210,7 @@ public class PortalOpener { * @param playerThe player to check portal state for
* @returnTrue if this portal opener's portal is open to the given player
*/ - public boolean isOpenFor(Player player) { + public boolean isOpenFor(@Nullable Player player) { //If closed, it's closed for everyone if (!isOpen) { return false; diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalRegistry.java b/src/main/java/net/knarcraft/stargate/portal/PortalRegistry.java index fe07562..ac0d016 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalRegistry.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalRegistry.java @@ -5,6 +5,7 @@ import net.knarcraft.stargate.config.DynmapManager; import net.knarcraft.stargate.container.BlockLocation; import net.knarcraft.stargate.utility.PortalFileHelper; import org.bukkit.World; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashMap; @@ -44,11 +45,11 @@ public class PortalRegistry { * * @param worldThe world containing the portals to clear
*/ - public static void clearPortals(World world) { + public static void clearPortals(@NotNull World world) { //Storing the portals to clear is necessary to avoid a concurrent modification exception ListA list of portals to remove
*/ - private static void clearPortals(ListA copy of the list of all portals
*/ + @NotNull public static ListA copy of the frame block lookup map
*/ + @NotNull public static MapA copy of the control block lookup map
*/ + @NotNull public static MapA copy of the network portal lookup map
*/ + @NotNull public static MapA copy of all entrances to portal mappings
*/ + @NotNull public static MapA copy of all portal networks
*/ + @NotNull public static MapA copy of all bungee portals
*/ + @NotNull public static MapThe network to get portals from
* @returnA list of portal names
*/ - public static ListThe portal to un-register
* @param removeAllWhether to remove the portal from the list of all portals
*/ - public static void unregisterPortal(Portal portal, boolean removeAll) { + public static void unregisterPortal(@NotNull Portal portal, boolean removeAll) { Stargate.debug("Unregister", "Unregistering gate " + portal.getName()); portal.getPortalActivator().deactivate(); portal.getPortalOpener().closePortal(true); @@ -223,7 +232,9 @@ public class PortalRegistry { //Mark the portal's sign as unregistered new PortalSignDrawer(portal).drawUnregisteredSign(); - PortalFileHelper.saveAllPortals(portal.getWorld()); + if (portal.getWorld() != null) { + PortalFileHelper.saveAllPortals(portal.getWorld()); + } portal.setRegistered(false); DynmapManager.removePortalMarker(portal); } @@ -233,7 +244,7 @@ public class PortalRegistry { * * @param portalThe portal to register
*/ - static void registerPortal(Portal portal) { + public static void registerPortal(@NotNull Portal portal) { portal.getOptions().setFixed(portal.getDestinationName().length() > 0 || portal.getOptions().isRandom() || portal.getOptions().isBungee()); diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java index 00f8c25..506b702 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java @@ -12,8 +12,11 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Map; +import java.util.Objects; /** * The portal sign drawer draws the sing of a given portal @@ -33,7 +36,7 @@ public class PortalSignDrawer { * * @param portalThe portal whose sign this portal sign drawer is responsible for drawing
*/ - public PortalSignDrawer(Portal portal) { + public PortalSignDrawer(@NotNull Portal portal) { this.portal = portal; } @@ -44,7 +47,7 @@ public class PortalSignDrawer { * * @param newHighlightColorThe new highlight color
*/ - public static void setHighlightColor(ChatColor newHighlightColor) { + public static void setHighlightColor(@NotNull ChatColor newHighlightColor) { highlightColor = newHighlightColor; } @@ -55,7 +58,7 @@ public class PortalSignDrawer { * * @param newMainColorThe new main sign color
*/ - public static void setMainColor(ChatColor newMainColor) { + public static void setMainColor(@NotNull ChatColor newMainColor) { mainColor = newMainColor; } @@ -64,7 +67,7 @@ public class PortalSignDrawer { * * @param freeColorThe new color to use for marking free stargates
*/ - public static void setFreeColor(ChatColor freeColor) { + public static void setFreeColor(@NotNull ChatColor freeColor) { PortalSignDrawer.freeColor = freeColor; } @@ -73,7 +76,7 @@ public class PortalSignDrawer { * * @param signMainColorsThe per-sign main colors
*/ - public static void setPerSignMainColors(MapThe per-sign highlight colors
*/ - public static void setPerSignHighlightColors(MapThe currently used main sign color
*/ + @NotNull public static ChatColor getMainColor() { return mainColor; } @@ -100,6 +104,7 @@ public class PortalSignDrawer { * * @returnThe currently used highlighting sign color
*/ + @NotNull public static ChatColor getHighlightColor() { return highlightColor; } @@ -122,6 +127,7 @@ public class PortalSignDrawer { * * @returnThe sign of this sign drawer's portal
*/ + @Nullable private Sign getSign() { Block signBlock = portal.getSignLocation().getBlock(); BlockState state = signBlock.getState(); @@ -141,7 +147,7 @@ public class PortalSignDrawer { * * @param signDataAll necessary sign information
*/ - private void drawSign(SignData signData) { + private void drawSign(@NotNull SignData signData) { Sign sign = signData.getSign(); ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); @@ -174,7 +180,7 @@ public class PortalSignDrawer { * * @param signThe sign to clear
*/ - private void clearSign(Sign sign) { + private void clearSign(@NotNull Sign sign) { for (int index = 0; index <= 3; index++) { SignHelper.setSignLine(sign, index, ""); } @@ -198,7 +204,7 @@ public class PortalSignDrawer { * * @param signDataAll necessary sign information
*/ - private void drawNetworkSign(SignData signData) { + private void drawNetworkSign(@NotNull SignData signData) { PortalActivator destinations = portal.getPortalActivator(); int maxIndex = destinations.getDestinations().size() - 1; int signLineIndex = 0; @@ -233,12 +239,12 @@ public class PortalSignDrawer { * @param freeGatesColoredWhether to display free gates in a different color
* @param signLineIndexThe line to draw on
*/ - private void drawNetworkSignChosenLine(SignData signData, boolean freeGatesColored, int signLineIndex) { + private void drawNetworkSignChosenLine(@NotNull SignData signData, boolean freeGatesColored, int signLineIndex) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); if (freeGatesColored) { Portal destination = PortalHandler.getByName(portal.getDestinationName(), portal.getNetwork()); - boolean free = PermissionHelper.isFree(portal.getActivePlayer(), portal, destination); + boolean free = PermissionHelper.isFree(Objects.requireNonNull(portal.getActivePlayer()), portal, destination); ChatColor nameColor = (free ? freeColor : highlightColor); setLine(signData, signLineIndex, nameColor + ">" + (free ? freeColor : mainColor) + translateAllColorCodes(portal.getDestinationName()) + nameColor + "<"); @@ -255,7 +261,7 @@ public class PortalSignDrawer { * @param indexThe index of the sign line to change
* @param textThe new text on the sign
*/ - public void setLine(SignData signData, int index, String text) { + public void setLine(@NotNull SignData signData, int index, @NotNull String text) { ChatColor mainColor = signData.getMainSignColor(); SignHelper.setSignLine(signData.getSign(), index, mainColor + text); } @@ -268,13 +274,14 @@ public class PortalSignDrawer { * @param signLineIndexThe line to draw on
* @param destinationIndexThe index of the destination to draw
*/ - private void drawNetworkSignLine(SignData signData, boolean freeGatesColored, int signLineIndex, int destinationIndex) { + private void drawNetworkSignLine(@NotNull SignData signData, boolean freeGatesColored, int signLineIndex, + int destinationIndex) { ChatColor mainColor = signData.getMainSignColor(); PortalActivator destinations = portal.getPortalActivator(); String destinationName = destinations.getDestinations().get(destinationIndex); if (freeGatesColored) { Portal destination = PortalHandler.getByName(destinationName, portal.getNetwork()); - boolean free = PermissionHelper.isFree(portal.getActivePlayer(), portal, destination); + boolean free = PermissionHelper.isFree(Objects.requireNonNull(portal.getActivePlayer()), portal, destination); setLine(signData, signLineIndex, (free ? freeColor : mainColor) + translateAllColorCodes(destinationName)); } else { setLine(signData, signLineIndex, mainColor + translateAllColorCodes(destinationName)); @@ -286,12 +293,12 @@ public class PortalSignDrawer { * * @param signDataAll necessary sign information
*/ - private void drawBungeeSign(SignData signData) { + private void drawBungeeSign(@NotNull SignData signData) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); setLine(signData, 1, Stargate.getString("bungeeSign")); - setLine(signData, 2, highlightColor + ">" + mainColor + translateAllColorCodes(portal.getDestinationName()) + - highlightColor + "<"); + setLine(signData, 2, highlightColor + ">" + mainColor + + translateAllColorCodes(portal.getDestinationName()) + highlightColor + "<"); setLine(signData, 3, highlightColor + "[" + mainColor + translateAllColorCodes(portal.getNetwork()) + highlightColor + "]"); } @@ -303,7 +310,7 @@ public class PortalSignDrawer { * * @param signDataAll necessary sign information
*/ - private void drawInactiveSign(SignData signData) { + private void drawInactiveSign(@NotNull SignData signData) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); setLine(signData, 1, Stargate.getString("signRightClick")); @@ -321,7 +328,7 @@ public class PortalSignDrawer { * * @param signDataAll necessary sign information
*/ - private void drawFixedSign(SignData signData) { + private void drawFixedSign(@NotNull SignData signData) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); Portal destinationPortal = PortalHandler.getByName(Portal.cleanString(portal.getDestinationName()), @@ -353,7 +360,8 @@ public class PortalSignDrawer { * @param gateNameThe name of the invalid gate type
* @param lineIndexThe index of the line the invalid portal was found at
*/ - public static void markPortalWithInvalidGate(PortalLocation portalLocation, String gateName, int lineIndex) { + public static void markPortalWithInvalidGate(@NotNull PortalLocation portalLocation, @NotNull String gateName, + int lineIndex) { BlockState blockState = portalLocation.getSignLocation().getBlock().getState(); if (!(blockState instanceof Sign sign)) { return; @@ -370,7 +378,8 @@ public class PortalSignDrawer { * @param signTypeThe sign type to get the main color for
* @returnThe main color for the given sign type
*/ - private ChatColor getMainColor(Material signType) { + @NotNull + private ChatColor getMainColor(@NotNull Material signType) { ChatColor signColor = perSignMainColors.get(signType); if (signColor == null) { return mainColor; @@ -385,7 +394,8 @@ public class PortalSignDrawer { * @param signTypeThe sign type to get the highlight color for
* @returnThe highlight color for the given sign type
*/ - private ChatColor getHighlightColor(Material signType) { + @NotNull + private ChatColor getHighlightColor(@NotNull Material signType) { ChatColor signColor = perSignHighlightColors.get(signType); if (signColor == null) { return highlightColor; @@ -400,7 +410,8 @@ public class PortalSignDrawer { * @param inputThe input to translate color codes for
* @returnThe input with color codes converted translated from & to §
*/ - private String translateAllColorCodes(String input) { + @NotNull + private String translateAllColorCodes(@NotNull String input) { return ColorHelper.translateColorCodes(input, ColorConversion.RGB); } diff --git a/src/main/java/net/knarcraft/stargate/portal/property/PortalLocation.java b/src/main/java/net/knarcraft/stargate/portal/property/PortalLocation.java index 49c09ff..10fa189 100644 --- a/src/main/java/net/knarcraft/stargate/portal/property/PortalLocation.java +++ b/src/main/java/net/knarcraft/stargate/portal/property/PortalLocation.java @@ -5,6 +5,8 @@ import net.knarcraft.stargate.container.RelativeBlockVector; import org.bukkit.Axis; import org.bukkit.World; import org.bukkit.block.BlockFace; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Keeps track of location related data for a portal @@ -23,6 +25,7 @@ public class PortalLocation { * * @returnThe top-left block of the portal
*/ + @NotNull public BlockLocation getTopLeft() { return topLeft; } @@ -41,6 +44,7 @@ public class PortalLocation { * * @returnThe location of the portal's sign
*/ + @NotNull public BlockLocation getSignLocation() { return signLocation; } @@ -50,6 +54,7 @@ public class PortalLocation { * * @returnThe relative location of the portal's button
*/ + @Nullable public RelativeBlockVector getButtonVector() { return buttonVector; } @@ -59,16 +64,19 @@ public class PortalLocation { * * @returnThe button's block face
*/ + @NotNull public BlockFace getButtonFacing() { return buttonFacing; } /** * Gets the rotation axis, which is the axis along which the gate is placed + * *The portal's rotation axis is the cross axis of the button's axis
* * @returnThe portal's rotation axis
*/ + @NotNull public Axis getRotationAxis() { return getYaw() == 0.0F || getYaw() == 180.0F ? Axis.X : Axis.Z; } @@ -78,6 +86,7 @@ public class PortalLocation { * * @returnThe world this portal resides in
*/ + @Nullable public World getWorld() { return topLeft.getWorld(); } @@ -91,7 +100,8 @@ public class PortalLocation { * @param topLeftThe new top-left block of the portal's square structure
* @returnThe portal location Object
*/ - public PortalLocation setTopLeft(BlockLocation topLeft) { + @NotNull + public PortalLocation setTopLeft(@NotNull BlockLocation topLeft) { this.topLeft = topLeft; return this; } @@ -104,6 +114,7 @@ public class PortalLocation { * @param yawThe portal's new yaw
* @returnThe portal location Object
*/ + @NotNull public PortalLocation setYaw(float yaw) { this.yaw = yaw; return this; @@ -115,7 +126,8 @@ public class PortalLocation { * @param signLocationThe new sign location
* @returnThe portal location Object
*/ - public PortalLocation setSignLocation(BlockLocation signLocation) { + @NotNull + public PortalLocation setSignLocation(@NotNull BlockLocation signLocation) { this.signLocation = signLocation; return this; } @@ -126,7 +138,8 @@ public class PortalLocation { * @param buttonVectorThe new relative button location
* @returnThe portal location Object
*/ - public PortalLocation setButtonVector(RelativeBlockVector buttonVector) { + @NotNull + public PortalLocation setButtonVector(@Nullable RelativeBlockVector buttonVector) { this.buttonVector = buttonVector; return this; } @@ -137,7 +150,8 @@ public class PortalLocation { * @param buttonFacingThe new block face of the portal's button
* @returnThe portal location Object
*/ - public PortalLocation setButtonFacing(BlockFace buttonFacing) { + @NotNull + public PortalLocation setButtonFacing(@NotNull BlockFace buttonFacing) { this.buttonFacing = buttonFacing; return this; } diff --git a/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java b/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java index f7ba015..46c1649 100644 --- a/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java +++ b/src/main/java/net/knarcraft/stargate/portal/property/PortalOption.java @@ -1,5 +1,7 @@ package net.knarcraft.stargate.portal.property; +import org.jetbrains.annotations.NotNull; + /** * Each enum value represents one option a portal can have/use */ @@ -8,57 +10,57 @@ public enum PortalOption { /** * This option allows a portal to be hidden from others */ - HIDDEN('h', "stargate.option.hidden", 11), + HIDDEN('h', "hidden", 11), /** * This option allows a portal that's always on and does not need to be activated or opened each time */ - ALWAYS_ON('a', "stargate.option.alwayson", 12), + ALWAYS_ON('a', "alwayson", 12), /** * This option allows a portal that's private to the stargate's owner */ - PRIVATE('p', "stargate.option.private", 13), + PRIVATE('p', "private", 13), /** * This option allows a portal that's free even if stargates usually are not */ - FREE('f', "stargate.option.free", 15), + FREE('f', "free", 15), /** * This option allows a portal where players exit through the back of the portal */ - BACKWARDS('b', "stargate.option.backwards", 16), + BACKWARDS('b', "backwards", 16), /** * This option shows the gate in the network list even if it's always on */ - SHOW('s', "stargate.option.show", 17), + SHOW('s', "show", 17), /** * This option hides the network name on the sign */ - NO_NETWORK('n', "stargate.option.nonetwork", 18), + NO_NETWORK('n', "nonetwork", 18), /** * This option allows a portal where players teleport to a random exit portal in the network */ - RANDOM('r', "stargate.option.random", 19), + RANDOM('r', "random", 19), /** * This option allows a portal to teleport to another server connected through BungeeCord */ - BUNGEE('u', "stargate.admin.bungee", 20), + BUNGEE('u', "bungee", 20), /** * This option allows a portal which does not display a teleportation message, for better immersion */ - SILENT('q', "stargate.option.silent", 21), + SILENT('q', "silent", 21), /** * This option causes a fixed portal's sign to be removed after creation */ - NO_SIGN('v', "stargate.option.nosign", 22); + NO_SIGN('v', "nosign", 22); private final char characterRepresentation; private final String permissionString; @@ -70,9 +72,9 @@ public enum PortalOption { * @param characterRepresentationThe character representation used on the sign to allow this option
* @param permissionStringThe permission necessary to use this option
*/ - PortalOption(final char characterRepresentation, String permissionString, int saveIndex) { + PortalOption(final char characterRepresentation, @NotNull String permissionString, int saveIndex) { this.characterRepresentation = characterRepresentation; - this.permissionString = permissionString; + this.permissionString = "stargate.option." + permissionString; this.saveIndex = saveIndex; } @@ -90,6 +92,7 @@ public enum PortalOption { * * @returnThe permission necessary for this option
*/ + @NotNull public String getPermissionString() { return this.permissionString; } diff --git a/src/main/java/net/knarcraft/stargate/portal/property/PortalOptions.java b/src/main/java/net/knarcraft/stargate/portal/property/PortalOptions.java index 03cf40f..776d588 100644 --- a/src/main/java/net/knarcraft/stargate/portal/property/PortalOptions.java +++ b/src/main/java/net/knarcraft/stargate/portal/property/PortalOptions.java @@ -1,6 +1,7 @@ package net.knarcraft.stargate.portal.property; import net.knarcraft.stargate.Stargate; +import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -18,7 +19,7 @@ public class PortalOptions { * @param optionsAll options to keep track of
* @param hasDestinationWhether the portal has a fixed destination
*/ - public PortalOptions(MapA UUID, or a username for legacy support
*/ - public PortalOwner(String ownerIdentifier) { + public PortalOwner(@NotNull String ownerIdentifier) { parseIdentifier(ownerIdentifier); } @@ -29,7 +31,7 @@ public class PortalOwner { * * @param playerThe player which is the owner of the portal
*/ - public PortalOwner(Player player) { + public PortalOwner(@NotNull Player player) { this.ownerUUID = player.getUniqueId(); this.ownerName = player.getName(); } @@ -39,6 +41,7 @@ public class PortalOwner { * * @returnThe UUID of this owner, or null if a UUID is not available
*/ + @Nullable public UUID getUUID() { return ownerUUID; } @@ -51,7 +54,7 @@ public class PortalOwner { * * @param uniqueIdThe new unique id for the portal owner
*/ - public void setUUID(UUID uniqueId) { + public void setUUID(@NotNull UUID uniqueId) { if (ownerUUID == null) { ownerUUID = uniqueId; } else { @@ -64,6 +67,7 @@ public class PortalOwner { * * @returnThe name of this owner
*/ + @NotNull public String getName() { return ownerName; } @@ -76,6 +80,7 @@ public class PortalOwner { * * @returnThe owner's identifier
*/ + @NotNull public String getIdentifier() { if (ownerUUID != null) { return ownerUUID.toString(); @@ -93,7 +98,7 @@ public class PortalOwner { * * @param ownerIdentifierThe identifier for a portal's owner
*/ - private void parseIdentifier(String ownerIdentifier) { + private void parseIdentifier(@NotNull String ownerIdentifier) { UUID ownerUUID = null; String ownerName; if (ownerIdentifier.length() > 16) { @@ -102,7 +107,7 @@ public class PortalOwner { ownerUUID = UUID.fromString(ownerIdentifier); OfflinePlayer offlineOwner = Bukkit.getServer().getOfflinePlayer(ownerUUID); ownerName = offlineOwner.getName(); - } catch (IllegalArgumentException ex) { + } catch (IllegalArgumentException exception) { //Invalid as UUID and username, so just keep it as owner name and hope the server owner fixes it ownerName = ownerIdentifier; Stargate.debug("loadAllPortals", "Invalid stargate owner string: " + ownerIdentifier); diff --git a/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java b/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java index 2f324d0..ebf97f1 100644 --- a/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java +++ b/src/main/java/net/knarcraft/stargate/portal/property/PortalStructure.java @@ -5,6 +5,8 @@ import net.knarcraft.stargate.container.BlockLocation; import net.knarcraft.stargate.container.RelativeBlockVector; import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.property.gate.Gate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * The portal structure is responsible for the physical properties of a portal @@ -28,7 +30,7 @@ public class PortalStructure { * @param gateThe gate type used by this portal structure
* @param buttonThe real location of the portal's button
*/ - public PortalStructure(Portal portal, Gate gate, BlockLocation button) { + public PortalStructure(@NotNull Portal portal, @NotNull Gate gate, @Nullable BlockLocation button) { this.portal = portal; this.gate = gate; this.verified = false; @@ -40,6 +42,7 @@ public class PortalStructure { * * @returnThe gate used by this portal structure
*/ + @NotNull public Gate getGate() { return gate; } @@ -49,6 +52,7 @@ public class PortalStructure { * * @returnThe location of this portal's button
*/ + @Nullable public BlockLocation getButton() { return button; } @@ -58,7 +62,7 @@ public class PortalStructure { * * @param buttonThe location of this portal's button
*/ - public void setButton(BlockLocation button) { + public void setButton(@NotNull BlockLocation button) { this.button = button; } @@ -113,7 +117,8 @@ public class PortalStructure { * @param vectorsThe relative block vectors to convert
* @returnA list of block locations
*/ - private BlockLocation[] relativeBlockVectorsToBlockLocations(RelativeBlockVector[] vectors) { + @NotNull + private BlockLocation[] relativeBlockVectorsToBlockLocations(@NotNull RelativeBlockVector[] vectors) { BlockLocation[] locations = new BlockLocation[vectors.length]; for (int i = 0; i < vectors.length; i++) { locations[i] = portal.getBlockAt(vectors[i]); @@ -126,6 +131,7 @@ public class PortalStructure { * * @returnThe locations of this portal's entrances
*/ + @NotNull public BlockLocation[] getEntrances() { if (entrances == null) { //Get the locations of the entrances once, and only if necessary as it's an expensive operation @@ -139,6 +145,7 @@ public class PortalStructure { * * @returnThe locations of this portal's frame
*/ + @NotNull public BlockLocation[] getFrame() { if (frame == null) { //Get the locations of the frame blocks once, and only if necessary as it's an expensive operation diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java index d488ca2..57c6dd2 100644 --- a/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java +++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/Gate.java @@ -5,6 +5,8 @@ import net.knarcraft.stargate.container.BlockLocation; import net.knarcraft.stargate.container.RelativeBlockVector; import org.bukkit.Material; import org.bukkit.Tag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.BufferedWriter; import java.io.File; @@ -24,10 +26,12 @@ public class Gate { private final GateLayout layout; private final MapThe cost of destroying a portal with this gate layout (-1 to disable)
* @param toOwnerWhether any payment should go to the owner of the gate, as opposed to just disappearing
*/ - public Gate(String filename, GateLayout layout, MapThis gate's layout
*/ + @NotNull public GateLayout getLayout() { return layout; } @@ -80,6 +86,7 @@ public class Gate { * * @returnThe character to material map
*/ + @NotNull public MapThe material to check
* @returnTrue if the material is valid for control blocks
*/ - public boolean isValidControlBlock(Material material) { - return (getControlBlock() != null) ? getControlBlock().equals(material) : getControlBlockTag().isTagged(material); + public boolean isValidControlBlock(@NotNull Material material) { + return (getControlBlock() != null) ? getControlBlock().equals(material) : + getControlBlockTag().isTagged(material); } /** @@ -99,6 +107,7 @@ public class Gate { * * @returnThe material tag type used for control blocks
*/ + @NotNull public TagThe material type used for control blocks
*/ + @Nullable public Material getControlBlock() { return characterMaterialMap.get(GateHandler.getControlBlockCharacter()); } @@ -117,6 +127,7 @@ public class Gate { * * @returnThe filename of this gate's file
*/ + @NotNull public String getFilename() { return filename; } @@ -126,6 +137,7 @@ public class Gate { * * @returnThe block type to use for the opening when open
*/ + @NotNull public Material getPortalOpenBlock() { return portalOpenBlock; } @@ -135,6 +147,7 @@ public class Gate { * * @returnThe block type to use for the opening when closed
*/ + @NotNull public Material getPortalClosedBlock() { return portalClosedBlock; } @@ -144,6 +157,7 @@ public class Gate { * * @returnThe material to use for a portal's button if using this gate type
*/ + @NotNull public Material getPortalButton() { return portalButton; } @@ -162,6 +176,7 @@ public class Gate { * * @returnThe cost of creating a portal with this gate
*/ + @NotNull public Integer getCreateCost() { return createCost < 0 ? Stargate.getEconomyConfig().getDefaultCreateCost() : createCost; } @@ -171,6 +186,7 @@ public class Gate { * * @returnThe cost of destroying a portal with this gate
*/ + @NotNull public Integer getDestroyCost() { return destroyCost < 0 ? Stargate.getEconomyConfig().getDefaultDestroyCost() : destroyCost; } @@ -180,6 +196,7 @@ public class Gate { * * @returnWhether portal payments go to the owner
*/ + @NotNull public Boolean getToOwner() { return toOwner; } @@ -191,7 +208,7 @@ public class Gate { * @param yawThe yaw when looking directly outwards
* @returnTrue if this gate matches the portal
*/ - public boolean matches(BlockLocation topLeft, double yaw) { + public boolean matches(@NotNull BlockLocation topLeft, double yaw) { return matches(topLeft, yaw, false); } @@ -207,7 +224,7 @@ public class Gate { * @param onCreateWhether this is used in the context of creating a new gate
* @returnTrue if this gate matches the portal
*/ - public boolean matches(BlockLocation topLeft, double yaw, boolean onCreate) { + public boolean matches(@NotNull BlockLocation topLeft, double yaw, boolean onCreate) { return verifyGateEntrancesMatch(topLeft, yaw, onCreate) && verifyGateBorderMatches(topLeft, yaw); } @@ -218,12 +235,12 @@ public class Gate { * @param yawThe yaw when looking directly outwards from the portal
* @returnTrue if all border blocks of the gate match the layout
*/ - private boolean verifyGateBorderMatches(BlockLocation topLeft, double yaw) { + private boolean verifyGateBorderMatches(@NotNull BlockLocation topLeft, double yaw) { MapWhether this is used in the context of creating a new gate
* @returnWhether this is used in the context of creating a new gate
*/ - private boolean verifyGateEntrancesMatch(BlockLocation topLeft, double yaw, boolean onCreate) { + private boolean verifyGateEntrancesMatch(@NotNull BlockLocation topLeft, double yaw, boolean onCreate) { Stargate.debug("verifyGateEntrancesMatch", String.valueOf(topLeft)); for (RelativeBlockVector entranceVector : layout.getEntrances()) { Stargate.debug("verifyGateEntrancesMatch", String.valueOf(entranceVector)); @@ -289,7 +306,7 @@ public class Gate { * * @param gateFolderThe folder to save the gate file in
*/ - public void save(String gateFolder) { + public void save(@NotNull String gateFolder) { try { BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File(gateFolder, filename))); @@ -321,7 +338,7 @@ public class Gate { * @param bufferedWriterThe buffered writer to write to
* @throws IOExceptionIf unable to write to the buffered writer
*/ - private void saveEconomyValues(BufferedWriter bufferedWriter) throws IOException { + private void saveEconomyValues(@NotNull BufferedWriter bufferedWriter) throws IOException { //Write use cost if not disabled if (useCost != -1) { writeConfig(bufferedWriter, "usecost", useCost); @@ -343,7 +360,7 @@ public class Gate { * @param bufferedWriterThe buffered writer to write to
* @throws IOExceptionIf unable to write to the buffered writer
*/ - private void saveFrameBlockType(BufferedWriter bufferedWriter) throws IOException { + private void saveFrameBlockType(@NotNull BufferedWriter bufferedWriter) throws IOException { for (Map.EntryThe buffered writer to write to
* @throws IOExceptionIf unable to write to the buffered writer
*/ - private void saveFrameBlockType(Character key, String value, BufferedWriter bufferedWriter) throws IOException { + private void saveFrameBlockType(@NotNull Character key, @Nullable String value, + @NotNull BufferedWriter bufferedWriter) throws IOException { bufferedWriter.append(key.toString()); bufferedWriter.append('='); if (value != null) { @@ -385,7 +403,8 @@ public class Gate { * @param valueThe config value to save
* @throws IOExceptionIf unable to write to the buffered writer
*/ - private void writeConfig(BufferedWriter bufferedWriter, String key, Object value) throws IOException { + private void writeConfig(@NotNull BufferedWriter bufferedWriter, @NotNull String key, + @NotNull Object value) throws IOException { //Figure out the correct formatting to use String format = "%s="; if (value instanceof Boolean) { diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java index 197fe6b..ebdce4e 100644 --- a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java +++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateHandler.java @@ -8,6 +8,8 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Tag; import org.bukkit.block.Block; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.InputStream; @@ -48,6 +50,7 @@ public class GateHandler { * * @returnThe character used for blocks that are not part of the gate
*/ + @NotNull public static Character getAnythingCharacter() { return ANYTHING; } @@ -57,6 +60,7 @@ public class GateHandler { * * @returnThe character used for defining the entrance
*/ + @NotNull public static Character getEntranceCharacter() { return ENTRANCE; } @@ -66,6 +70,7 @@ public class GateHandler { * * @returnThe character used for defining the exit
*/ + @NotNull public static Character getExitCharacter() { return EXIT; } @@ -76,6 +81,7 @@ public class GateHandler { * * @returnThe character used for defining control blocks
*/ + @NotNull public static Character getControlBlockCharacter() { return CONTROL_BLOCK; } @@ -85,7 +91,7 @@ public class GateHandler { * * @param gateThe gate to register
*/ - private static void registerGate(Gate gate) { + private static void registerGate(@NotNull Gate gate) { gates.put(gate.getFilename(), gate); Material blockId = gate.getControlBlock(); @@ -110,7 +116,8 @@ public class GateHandler { * @param fileThe file containing the gate data
* @returnThe loaded gate, or null if unable to load the gate
*/ - private static Gate loadGate(File file) { + @Nullable + private static Gate loadGate(@NotNull File file) { try (Scanner scanner = new Scanner(file)) { return loadGate(file.getName(), file.getParent(), scanner); } catch (Exception exception) { @@ -127,7 +134,9 @@ public class GateHandler { * @param scannerThe scanner to use for reading the gate data
* @returnThe loaded gate or null if unable to load the gate
*/ - private static Gate loadGate(String fileName, String parentFolder, Scanner scanner) { + @Nullable + private static Gate loadGate(@NotNull String fileName, @NotNull String parentFolder, + @NotNull Scanner scanner) { ListA map between layout characters and the material tags to use
* @returnA new gate, or null if the config is invalid
*/ - private static Gate createGate(MapThe filename of the loaded gate file
* @returnTrue if the gate is valid. False otherwise
*/ - private static boolean validateGate(Gate gate, String fileName) { + private static boolean validateGate(@NotNull Gate gate, @NotNull String fileName) { String failString = String.format("Could not load Gate %s", fileName) + " - %s"; if (gate.getLayout().getControls().length != 2) { @@ -236,7 +247,7 @@ public class GateHandler { * * @param gateFolderThe folder containing the gates
*/ - public static void loadGates(String gateFolder) { + public static void loadGates(@NotNull String gateFolder) { File directory = new File(gateFolder); File[] files; @@ -269,7 +280,7 @@ public class GateHandler { * * @param gateFolderThe folder containing gate config files
*/ - public static void writeDefaultGatesToFolder(String gateFolder) { + public static void writeDefaultGatesToFolder(@NotNull String gateFolder) { loadGateFromJar("nethergate.gate", gateFolder); loadGateFromJar("watergate.gate", gateFolder); loadGateFromJar("endgate.gate", gateFolder); @@ -283,7 +294,7 @@ public class GateHandler { * @param gateFileThe name of the gate file
* @param gateFolderThe folder containing gates
*/ - private static void loadGateFromJar(String gateFile, String gateFolder) { + private static void loadGateFromJar(@NotNull String gateFile, @NotNull String gateFolder) { //Get an input stream for the internal file InputStream gateFileStream = Gate.class.getResourceAsStream("/gates/" + gateFile); if (gateFileStream != null) { @@ -305,7 +316,8 @@ public class GateHandler { * @param blockThe control block to check
* @returnA list of gates using the given control block
*/ - public static Gate[] getGatesByControlBlock(Block block) { + @NotNull + public static ListThe type of the control block to check
* @returnA list of gates using the given material for control block
*/ - public static Gate[] getGatesByControlBlock(Material type) { + @NotNull + public static ListThe filename of the gate to get
* @returnThe gate with the given filename
*/ - public static Gate getGateByName(String fileName) { + @Nullable + public static Gate getGateByName(@NotNull String fileName) { return gates.get(fileName); } diff --git a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateLayout.java b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateLayout.java index 540983e..1940471 100644 --- a/src/main/java/net/knarcraft/stargate/portal/property/gate/GateLayout.java +++ b/src/main/java/net/knarcraft/stargate/portal/property/gate/GateLayout.java @@ -1,6 +1,8 @@ package net.knarcraft.stargate.portal.property.gate; import net.knarcraft.stargate.container.RelativeBlockVector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.BufferedWriter; import java.io.IOException; @@ -28,7 +30,7 @@ public class GateLayout { * * @param layoutA character matrix describing the layout
*/ - public GateLayout(Character[][] layout) { + public GateLayout(@NotNull Character[][] layout) { this.layout = layout; readLayout(); } @@ -38,6 +40,7 @@ public class GateLayout { * * @returnThe character array describing this layout
*/ + @NotNull public Character[][] getLayout() { return this.layout; } @@ -49,6 +52,7 @@ public class GateLayout { * * @returnThe locations of entrances for this gate
*/ + @NotNull public RelativeBlockVector[] getEntrances() { return entrances; } @@ -61,6 +65,7 @@ public class GateLayout { * * @returnThe locations of border blocks for this gate
*/ + @NotNull public RelativeBlockVector[] getBorder() { return border; } @@ -70,6 +75,7 @@ public class GateLayout { * * @returnThe exit block defined in the layout
*/ + @Nullable public RelativeBlockVector getExit() { return exitBlock; } @@ -82,6 +88,7 @@ public class GateLayout { * * @returnAll possible exits
*/ + @NotNull public ListThe locations of the control blocks for this gate
*/ + @NotNull public RelativeBlockVector[] getControls() { return controls; } @@ -104,7 +112,7 @@ public class GateLayout { * @param bufferedWriterThe buffered writer to write to
* @throws IOExceptionIf unable to write to the buffered writer
*/ - public void saveLayout(BufferedWriter bufferedWriter) throws IOException { + public void saveLayout(@NotNull BufferedWriter bufferedWriter) throws IOException { for (Character[] line : this.layout) { for (Character character : line) { bufferedWriter.append(character); @@ -137,8 +145,9 @@ public class GateLayout { * @param entranceListThe list of entrances to save to
* @param borderListThe list of border blocks to save to
*/ - private void readLayout(ListThe list of entrances to save to
* @param borderListThe list of border blocks to save to
*/ - private void parseLayoutCharacter(Character key, int columnIndex, int rowIndex, int[] exitDepths, - ListThe character to check
* @returnTrue if the character represents an opening
*/ - private boolean isOpening(Character character) { + private boolean isOpening(@NotNull Character character) { return character.equals(GateHandler.getEntranceCharacter()) || character.equals(GateHandler.getExitCharacter()); } diff --git a/src/main/java/net/knarcraft/stargate/portal/teleporter/EntityTeleporter.java b/src/main/java/net/knarcraft/stargate/portal/teleporter/EntityTeleporter.java index e963c92..8b18d11 100644 --- a/src/main/java/net/knarcraft/stargate/portal/teleporter/EntityTeleporter.java +++ b/src/main/java/net/knarcraft/stargate/portal/teleporter/EntityTeleporter.java @@ -3,6 +3,7 @@ package net.knarcraft.stargate.portal.teleporter; import net.knarcraft.stargate.event.StargateEntityPortalEvent; import net.knarcraft.stargate.portal.Portal; import org.bukkit.entity.Entity; +import org.jetbrains.annotations.NotNull; /** * The portal teleporter takes care of the actual portal teleportation for any entities @@ -16,7 +17,7 @@ public class EntityTeleporter extends Teleporter { * * @param targetPortalThe portal which is the target of the teleportation
*/ - public EntityTeleporter(Portal targetPortal, Entity teleportingEntity) { + public EntityTeleporter(@NotNull Portal targetPortal, @NotNull Entity teleportingEntity) { super(targetPortal, teleportingEntity); this.teleportingEntity = teleportingEntity; } @@ -27,7 +28,7 @@ public class EntityTeleporter extends Teleporter { * @param originThe portal the entity is teleporting from
* @returnTrue if the entity was teleported. False otherwise
*/ - public boolean teleportEntity(Portal origin) { + public boolean teleportEntity(@NotNull Portal origin) { return teleport(origin, new StargateEntityPortalEvent(teleportingEntity, origin, portal, exit)); } diff --git a/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java b/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java index 3460340..e34a68c 100644 --- a/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java +++ b/src/main/java/net/knarcraft/stargate/portal/teleporter/PlayerTeleporter.java @@ -10,6 +10,8 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -26,7 +28,7 @@ public class PlayerTeleporter extends Teleporter { * @param targetPortalThe portal which is the target of the teleportation
* @param playerThe teleporting player
*/ - public PlayerTeleporter(Portal targetPortal, Player player) { + public PlayerTeleporter(@NotNull Portal targetPortal, @NotNull Player player) { super(targetPortal, player); this.player = player; } @@ -37,7 +39,7 @@ public class PlayerTeleporter extends Teleporter { * @param originThe portal the player teleports from
* @param eventThe player move event triggering the event
*/ - public void teleportPlayer(Portal origin, PlayerMoveEvent event) { + public void teleportPlayer(@NotNull Portal origin, @Nullable PlayerMoveEvent event) { double velocity = player.getVelocity().length(); ListThe portal which is the target of the teleportation
* @param teleportedEntityThe entity teleported by this teleporter
*/ - public Teleporter(Portal portal, Entity teleportedEntity) { + public Teleporter(@NotNull Portal portal, @NotNull Entity teleportedEntity) { this.portal = portal; this.scheduler = Stargate.getInstance().getServer().getScheduler(); this.teleportedEntity = teleportedEntity; @@ -69,11 +71,11 @@ public abstract class Teleporter { * @param stargateTeleportEventThe event to call to make sure the teleportation is valid
* @returnTrue if the teleportation was successfully performed
*/ - public boolean teleport(Portal origin, StargateTeleportEvent stargateTeleportEvent) { + public boolean teleport(@NotNull Portal origin, @Nullable StargateTeleportEvent stargateTeleportEvent) { ListThe exit location of this teleporter
*/ + @NotNull public Location getExit() { return exit.clone(); } @@ -107,7 +110,9 @@ public abstract class Teleporter { * @param stargateTeleportEventThe exit location to teleport the entity to
* @returnThe location the entity should be teleported to, or null if the event was cancelled
*/ - protected Location triggerPortalEvent(Portal origin, StargateTeleportEvent stargateTeleportEvent) { + @Nullable + protected Location triggerPortalEvent(@NotNull Portal origin, + @NotNull StargateTeleportEvent stargateTeleportEvent) { Stargate.getInstance().getServer().getPluginManager().callEvent((Event) stargateTeleportEvent); //Teleport is cancelled. Teleport the entity back to where it came from just for sanity's sake if (stargateTeleportEvent.isCancelled()) { @@ -122,7 +127,7 @@ public abstract class Teleporter { * * @param exitThe location the entity will exit from
*/ - protected void adjustExitLocationRotation(Location exit) { + protected void adjustExitLocationRotation(@NotNull Location exit) { int adjust = 0; if (portal.getOptions().isBackwards()) { adjust = 180; @@ -151,7 +156,9 @@ public abstract class Teleporter { * @param entityThe travelling entity
* @returnA location which won't suffocate the entity inside the portal
*/ - private Location preventExitSuffocation(RelativeBlockVector relativeExit, Location exitLocation, Entity entity) { + @NotNull + private Location preventExitSuffocation(@NotNull RelativeBlockVector relativeExit, + @NotNull Location exitLocation, @NotNull Entity entity) { //Go left to find start of opening RelativeBlockVector openingLeft = getPortalExitEdge(relativeExit, -1); @@ -159,8 +166,8 @@ public abstract class Teleporter { RelativeBlockVector openingRight = getPortalExitEdge(relativeExit, 1); //Get the width to check if the entity fits - int openingWidth = openingRight.getRight() - openingLeft.getRight() + 1; - int existingOffset = relativeExit.getRight() - openingLeft.getRight(); + int openingWidth = openingRight.right() - openingLeft.right() + 1; + int existingOffset = relativeExit.right() - openingLeft.right(); double newOffset = (openingWidth - existingOffset) / 2D; //Remove the half offset for better centering @@ -180,7 +187,8 @@ public abstract class Teleporter { * @param entityThe entity to adjust the exit location for
* @returnThe adjusted exit location
*/ - private Location moveExitLocationOutwards(Location exitLocation, Entity entity) { + @NotNull + private Location moveExitLocationOutwards(@NotNull Location exitLocation, @NotNull Entity entity) { double entitySize = EntityHelper.getEntityMaxSize(entity); int entityBoxSize = EntityHelper.getEntityMaxSizeInt(entity); if (entitySize > 1) { @@ -207,12 +215,13 @@ public abstract class Teleporter { * @param directionThe direction to move (+1 for right, -1 for left)
* @returnThe right or left edge of the opening
*/ - private RelativeBlockVector getPortalExitEdge(RelativeBlockVector relativeExit, int direction) { + @NotNull + private RelativeBlockVector getPortalExitEdge(@NotNull RelativeBlockVector relativeExit, int direction) { RelativeBlockVector openingEdge = relativeExit; do { - RelativeBlockVector possibleOpening = new RelativeBlockVector(openingEdge.getRight() + direction, - openingEdge.getDown(), openingEdge.getOut()); + RelativeBlockVector possibleOpening = new RelativeBlockVector(openingEdge.right() + direction, + openingEdge.down(), openingEdge.out()); if (portal.getGate().getLayout().getExits().contains(possibleOpening)) { openingEdge = possibleOpening; } else { @@ -234,7 +243,8 @@ public abstract class Teleporter { * @param exitLocationThe exit location generated
* @returnThe location the travelling entity should be teleported to
*/ - private Location adjustExitLocationHeight(Entity entity, Location exitLocation) { + @NotNull + private Location adjustExitLocationHeight(@NotNull Entity entity, @Nullable Location exitLocation) { if (exitLocation != null) { BlockData blockData = exitLocation.getBlock().getBlockData(); if ((blockData instanceof Bisected bisected && bisected.getHalf() == Bisected.Half.BOTTOM) || @@ -257,7 +267,8 @@ public abstract class Teleporter { * @param entityThe entity to teleport (used to determine distance from portal to avoid suffocation)
* @returnThe location the entity should be teleported to.
*/ - private Location getExit(Entity entity) { + @NotNull + private Location getExit(@NotNull Entity entity) { Location exitLocation = null; RelativeBlockVector relativeExit = portal.getGate().getLayout().getExit(); if (relativeExit != null) { @@ -270,12 +281,10 @@ public abstract class Teleporter { } exitLocation = exit.getRelativeLocation(0D, 0D, 1, portalYaw); - if (entity != null) { - double entitySize = EntityHelper.getEntityMaxSize(entity); - //Prevent exit suffocation for players riding horses or similar - if (entitySize > 1) { - exitLocation = preventExitSuffocation(relativeExit, exitLocation, entity); - } + double entitySize = EntityHelper.getEntityMaxSize(entity); + //Prevent exit suffocation for players riding horses or similar + if (entitySize > 1) { + exitLocation = preventExitSuffocation(relativeExit, exitLocation, entity); } } else { Stargate.logWarning(String.format("Missing destination point in .gate file %s", @@ -293,6 +302,7 @@ public abstract class Teleporter { * * @returnA list of chunks to load
*/ + @NotNull private ListThe targetPortal which is the target of the teleportation
* @param teleportingVehicleThe teleporting vehicle
*/ - public VehicleTeleporter(Portal targetPortal, Vehicle teleportingVehicle) { + public VehicleTeleporter(@NotNull Portal targetPortal, @NotNull Vehicle teleportingVehicle) { super(targetPortal, teleportingVehicle); this.teleportingVehicle = teleportingVehicle; } @@ -45,7 +46,7 @@ public class VehicleTeleporter extends EntityTeleporter { * @returnTrue if the vehicle was teleported. False otherwise
*/ @Override - public boolean teleportEntity(Portal origin) { + public boolean teleportEntity(@NotNull Portal origin) { Stargate.debug("VehicleTeleporter::teleport", "Preparing to teleport: " + teleportingVehicle); double velocity = teleportingVehicle.getVelocity().length(); @@ -75,7 +76,7 @@ public class VehicleTeleporter extends EntityTeleporter { * @param originThe portal the vehicle teleported from
* @returnTrue if the vehicle was teleported. False otherwise
*/ - private boolean teleportVehicle(Location exit, Vector newVelocity, Portal origin) { + private boolean teleportVehicle(@NotNull Location exit, @NotNull Vector newVelocity, @NotNull Portal origin) { //Load chunks to make sure not to teleport to the void loadChunks(); @@ -113,7 +114,7 @@ public class VehicleTeleporter extends EntityTeleporter { * @param passengersThe passengers to teleport
* @returnTrue if the passengers are allowed to teleport
*/ - private boolean vehiclePassengersAllowed(ListThe new velocity of the teleported vehicle
* @param originThe portal the vehicle teleported from
*/ - private void teleportVehicle(ListThe new velocity of the new vehicle
* @param originThe portal the vehicle teleported from
*/ - private void putPassengersInNewVehicle(ListThe block to fix
*/ - private static void fixEndGatewayGate(Block block) { + private static void fixEndGatewayGate(@NotNull Block block) { EndGateway gateway = (EndGateway) block.getState(); gateway.setAge(Long.MIN_VALUE); if (block.getWorld().getEnvironment() == World.Environment.THE_END) { @@ -74,7 +75,7 @@ public class BlockChangeThread implements Runnable { * @param blockThe block to orient
* @param axisThe axis to use for orienting the block
*/ - private static void orientBlock(Block block, Axis axis) { + private static void orientBlock(@NotNull Block block, @NotNull Axis axis) { Orientable orientable = (Orientable) block.getBlockData(); orientable.setAxis(axis); block.setBlockData(orientable); diff --git a/src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java b/src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java index 1372507..134419b 100644 --- a/src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/BStatsHelper.java @@ -8,6 +8,7 @@ import org.bstats.bukkit.Metrics; import org.bstats.charts.SimplePie; import org.bstats.charts.SingleLineChart; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Map; @@ -28,7 +29,7 @@ public final class BStatsHelper { * * @param pluginThe plugin to initialize BStats for
*/ - public static void initialize(JavaPlugin plugin) { + public static void initialize(@NotNull JavaPlugin plugin) { if (hasBeenInitialized) { throw new IllegalArgumentException("BStats initialized twice"); } else { diff --git a/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java b/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java index b59bde2..1145d73 100644 --- a/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/BungeeHelper.java @@ -7,6 +7,8 @@ import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter; import net.md_5.bungee.api.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -36,6 +38,7 @@ public final class BungeeHelper { * * @returnThe bungee plugin channel
*/ + @NotNull public static String getBungeeChannel() { return bungeeChannel; } @@ -48,9 +51,10 @@ public final class BungeeHelper { * queue and teleported to the destination. * * @param playerUUIDThe UUID of the player to remove
- * @returnThe name of the destination portal the player should be teleported to
+ * @returnThe name of the destination portal the player should be teleported to, or null if not queued
*/ - public static String removeFromQueue(UUID playerUUID) { + @Nullable + public static String removeFromQueue(@NotNull UUID playerUUID) { return bungeeQueue.remove(playerUUID); } @@ -61,7 +65,7 @@ public final class BungeeHelper { * @param entrancePortalThe portal the player is teleporting from
* @returnTrue if the message was successfully sent
*/ - public static boolean sendTeleportationMessage(Player player, Portal entrancePortal) { + public static boolean sendTeleportationMessage(@NotNull Player player, @NotNull Portal entrancePortal) { try { //Build the teleportation message, format isThe bungee portal the player is teleporting from
* @returnTrue if the plugin message was sent successfully
*/ - public static boolean changeServer(Player player, Portal entrancePortal) { + public static boolean changeServer(@NotNull Player player, @NotNull Portal entrancePortal) { try { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); @@ -119,6 +123,7 @@ public final class BungeeHelper { * @param messageThe byte array to read
* @returnThe message contained in the byte array, or null on failure
*/ + @Nullable public static String readPluginMessage(byte[] message) { byte[] data; try { @@ -147,7 +152,7 @@ public final class BungeeHelper { * * @param receivedMessageThe received teleport message
*/ - public static void handleTeleportMessage(String receivedMessage) { + public static void handleTeleportMessage(@NotNull String receivedMessage) { //Get the player id and destination from the message String[] messageParts = receivedMessage.split(teleportMessageDelimiter); UUID playerUUID = UUID.fromString(messageParts[0]); @@ -176,7 +181,8 @@ public final class BungeeHelper { * @param eventThe event causing the teleportation
* @returnTrue if the teleportation was successful
*/ - public static boolean bungeeTeleport(Player player, Portal entrancePortal, PlayerMoveEvent event) { + public static boolean bungeeTeleport(@NotNull Player player, @NotNull Portal entrancePortal, + @NotNull PlayerMoveEvent event) { //Check if bungee is actually enabled if (!Stargate.getGateConfig().enableBungee()) { if (!entrancePortal.getOptions().isSilent()) { @@ -211,7 +217,8 @@ public final class BungeeHelper { * @param stringThe string to strip color from
* @returnThe string without color codes
*/ - private static String stripColor(String string) { + @NotNull + private static String stripColor(@NotNull String string) { return ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', string)); } diff --git a/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java b/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java index 82adf9f..0300cc4 100644 --- a/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/DirectionHelper.java @@ -3,6 +3,7 @@ package net.knarcraft.stargate.utility; import org.bukkit.Location; import org.bukkit.block.BlockFace; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; /** * This class helps with direction-related calculations @@ -24,7 +25,7 @@ public final class DirectionHelper { * @param location2The second location, which the yaw will point towards
* @returnThe yaw pointing from the first location to the second location
*/ - public static float getYawFromLocationDifference(Location location1, Location location2) { + public static float getYawFromLocationDifference(@NotNull Location location1, @NotNull Location location2) { Location difference = location1.clone().subtract(location2.clone()); if (difference.getX() > 0) { return 90; @@ -45,8 +46,10 @@ public final class DirectionHelper { * * @param yawThe yaw value to convert
* @returnThe block face the yaw corresponds to
+ * @throws IllegalArgumentExceptionIf a yaw not divisible by 90 us given
*/ - public static BlockFace getBlockFaceFromYaw(double yaw) { + @NotNull + public static BlockFace getBlockFaceFromYaw(double yaw) throws IllegalArgumentException { //Make sure the yaw is between 0 and 360 yaw = normalizeYaw(yaw); @@ -68,8 +71,10 @@ public final class DirectionHelper { * * @param yawThe yaw to convert to a direction vector
* @returnThe direction vector pointing in the same direction as the yaw
+ * @throws IllegalArgumentExceptionIf a yaw not divisible by 90 is given
*/ - public static Vector getDirectionVectorFromYaw(double yaw) { + @NotNull + public static Vector getDirectionVectorFromYaw(double yaw) throws IllegalArgumentException { //Make sure the yaw is between 0 and 360 yaw = normalizeYaw(yaw); @@ -99,7 +104,8 @@ public final class DirectionHelper { * @param yawThe yaw when looking directly outwards from a portal
* @returnA location relative to the given location
*/ - public static Location moveLocation(Location location, double right, double down, double out, double yaw) { + @NotNull + public static Location moveLocation(@NotNull Location location, double right, double down, double out, double yaw) { return location.add(getCoordinateVectorFromRelativeVector(right, down, out, yaw)); } @@ -111,8 +117,11 @@ public final class DirectionHelper { * @param outThe distance outward from the top-left origin
* @param yawThe yaw when looking directly outwards from a portal
* @returnA normal vector
+ * @throws IllegalArgumentExceptionIf a yaw not divisible by 90 is given
*/ - public static Vector getCoordinateVectorFromRelativeVector(double right, double down, double out, double yaw) { + @NotNull + public static Vector getCoordinateVectorFromRelativeVector(double right, double down, double out, + double yaw) throws IllegalArgumentException { //Make sure the yaw is between 0 and 360 yaw = normalizeYaw(yaw); diff --git a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java index 3bdccb1..aa462f3 100644 --- a/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/EconomyHelper.java @@ -9,6 +9,8 @@ import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -29,7 +31,7 @@ public final class EconomyHelper { * @param costThe cost of teleportation
* @returnFalse if payment was successful. True if the payment was unsuccessful
*/ - public static boolean cannotPayTeleportFee(Portal entrancePortal, Player player, int cost) { + public static boolean cannotPayTeleportFee(@NotNull Portal entrancePortal, @NotNull Player player, int cost) { boolean success; //Try to charge the player. Paying the portal owner is only possible if a UUID is available @@ -78,7 +80,7 @@ public final class EconomyHelper { * @param portalOwnerThe owner of the portal
* @param earningsThe amount the owner earned
*/ - public static void sendObtainMessage(String portalName, Player portalOwner, int earnings) { + public static void sendObtainMessage(@NotNull String portalName, @NotNull Player portalOwner, int earnings) { String obtainedMsg = Stargate.getString("ecoObtain"); obtainedMsg = replacePlaceholders(obtainedMsg, portalName, earnings); Stargate.getMessageSender().sendSuccessMessage(portalOwner, obtainedMsg); @@ -91,7 +93,7 @@ public final class EconomyHelper { * @param playerThe interacting player
* @param costThe cost of the interaction
*/ - public static void sendDeductMessage(String portalName, Player player, int cost) { + public static void sendDeductMessage(@NotNull String portalName, @NotNull Player player, int cost) { String deductMsg = Stargate.getString("ecoDeduct"); deductMsg = replacePlaceholders(deductMsg, portalName, cost); Stargate.getMessageSender().sendSuccessMessage(player, deductMsg); @@ -104,7 +106,7 @@ public final class EconomyHelper { * @param playerThe interacting player
* @param costThe cost of the interaction
*/ - public static void sendInsufficientFundsMessage(String portalName, Player player, int cost) { + public static void sendInsufficientFundsMessage(@NotNull String portalName, @NotNull Player player, int cost) { String inFundMsg = Stargate.getString("ecoInFunds"); inFundMsg = replacePlaceholders(inFundMsg, portalName, cost); Stargate.getMessageSender().sendErrorMessage(player, inFundMsg); @@ -117,7 +119,7 @@ public final class EconomyHelper { * @param playerThe player breaking the portal
* @param costThe amount the user has to pay for destroying the portal. (expects a negative value)
*/ - public static void sendRefundMessage(String portalName, Player player, int cost) { + public static void sendRefundMessage(@NotNull String portalName, @NotNull Player player, int cost) { String refundMsg = Stargate.getString("ecoRefund"); refundMsg = replacePlaceholders(refundMsg, portalName, -cost); Stargate.getMessageSender().sendSuccessMessage(player, refundMsg); @@ -131,7 +133,7 @@ public final class EconomyHelper { * @param destinationThe destination portal
* @returnThe cost of using the portal
*/ - public static int getUseCost(Player player, Portal source, Portal destination) { + public static int getUseCost(@NotNull Player player, @NotNull Portal source, @Nullable Portal destination) { EconomyConfig config = Stargate.getEconomyConfig(); //No payment required if (!config.useEconomy() || source.getOptions().isFree()) { @@ -161,7 +163,7 @@ public final class EconomyHelper { * @param costThe cost of the transaction
* @returnTrue if the player was charged successfully
*/ - public static boolean chargePlayerIfNecessary(Player player, UUID target, int cost) { + public static boolean chargePlayerIfNecessary(@NotNull Player player, @NotNull UUID target, int cost) { if (skipPayment(cost)) { return true; } @@ -176,7 +178,7 @@ public final class EconomyHelper { * @param amountThe amount to charge
* @returnTrue if the payment succeeded, or if no payment was necessary
*/ - private static boolean chargePlayer(Player player, double amount) { + private static boolean chargePlayer(@NotNull Player player, double amount) { Economy economy = Stargate.getEconomyConfig().getEconomy(); if (Stargate.getEconomyConfig().isEconomyEnabled() && economy != null) { if (!economy.has(player, amount)) { @@ -198,7 +200,7 @@ public final class EconomyHelper { * @param costThe cost to transfer
*/ @SuppressWarnings("deprecation") - private static void transferFees(Economy economy, int cost) { + private static void transferFees(@NotNull Economy economy, int cost) { String accountName = Stargate.getEconomyConfig().getTaxAccount(); if (accountName == null || accountName.isEmpty()) { return; @@ -220,7 +222,7 @@ public final class EconomyHelper { * @param costThe cost of the transaction
* @returnTrue if the player was charged successfully
*/ - public static boolean chargePlayerIfNecessary(Player player, int cost) { + public static boolean chargePlayerIfNecessary(@NotNull Player player, int cost) { if (skipPayment(cost)) { return true; } @@ -228,8 +230,9 @@ public final class EconomyHelper { boolean charged = chargePlayer(player, cost); // Transfer the charged amount to the tax account - if (charged) { - transferFees(Stargate.getEconomyConfig().getEconomy(), cost); + Economy economy = Stargate.getEconomyConfig().getEconomy(); + if (charged && economy != null) { + transferFees(economy, cost); } return charged; @@ -253,9 +256,10 @@ public final class EconomyHelper { * @param amountThe amount to charge
* @returnTrue if the payment succeeded, or if no payment was necessary
*/ - private static boolean chargePlayer(Player player, UUID target, double amount) { + private static boolean chargePlayer(@NotNull Player player, @NotNull UUID target, double amount) { Economy economy = Stargate.getEconomyConfig().getEconomy(); - if (Stargate.getEconomyConfig().isEconomyEnabled() && player.getUniqueId().compareTo(target) != 0 && economy != null) { + if (Stargate.getEconomyConfig().isEconomyEnabled() && player.getUniqueId().compareTo(target) != 0 && + economy != null) { if (!economy.has(player, amount)) { return false; } @@ -274,7 +278,8 @@ public final class EconomyHelper { * @param costThe cost for a given interaction
* @returnThe same string with cost and portal variables replaced
*/ - private static String replacePlaceholders(String message, String portalName, int cost) { + @NotNull + private static String replacePlaceholders(@NotNull String message, @NotNull String portalName, int cost) { return StringFormatter.replacePlaceholders(message, new String[]{"%cost%", "%portal%"}, new String[]{Stargate.getEconomyConfig().format(cost), portalName}); } diff --git a/src/main/java/net/knarcraft/stargate/utility/EntityHelper.java b/src/main/java/net/knarcraft/stargate/utility/EntityHelper.java index 04ed19f..72adf56 100644 --- a/src/main/java/net/knarcraft/stargate/utility/EntityHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/EntityHelper.java @@ -1,6 +1,7 @@ package net.knarcraft.stargate.utility; import org.bukkit.entity.Entity; +import org.jetbrains.annotations.NotNull; /** * This helper class helps with entity properties not immediately available @@ -21,7 +22,7 @@ public final class EntityHelper { * @param entityThe entity to get max size for
* @returnThe max size of the entity
*/ - public static int getEntityMaxSizeInt(Entity entity) { + public static int getEntityMaxSizeInt(@NotNull Entity entity) { return (int) Math.ceil((float) getEntityMaxSize(entity)); } @@ -31,7 +32,7 @@ public final class EntityHelper { * @param entityThe entity to get max size for
* @returnThe max size of the entity
*/ - public static double getEntityMaxSize(Entity entity) { + public static double getEntityMaxSize(@NotNull Entity entity) { return Math.max(entity.getBoundingBox().getWidthX(), entity.getBoundingBox().getWidthZ()); } diff --git a/src/main/java/net/knarcraft/stargate/utility/FileHelper.java b/src/main/java/net/knarcraft/stargate/utility/FileHelper.java index be88ef3..77385c6 100644 --- a/src/main/java/net/knarcraft/stargate/utility/FileHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/FileHelper.java @@ -1,12 +1,18 @@ package net.knarcraft.stargate.utility; +import org.jetbrains.annotations.NotNull; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -public class FileHelper { +public final class FileHelper { + + private FileHelper() { + + } /** * Converts the stream directly into a string, includes the newline character @@ -15,7 +21,8 @@ public class FileHelper { * @returnA String of the file read
* @throws IOExceptionIf unable to read the stream
*/ - public static String readStreamToString(InputStream stream) throws IOException { + @NotNull + public static String readStreamToString(@NotNull InputStream stream) throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(stream, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(inputStreamReader); String line = reader.readLine(); diff --git a/src/main/java/net/knarcraft/stargate/utility/GateReader.java b/src/main/java/net/knarcraft/stargate/utility/GateReader.java index 4903fd0..d8804fb 100644 --- a/src/main/java/net/knarcraft/stargate/utility/GateReader.java +++ b/src/main/java/net/knarcraft/stargate/utility/GateReader.java @@ -5,6 +5,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Tag; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -31,12 +32,12 @@ public final class GateReader { * @param configThe map of config values to store to
* @returnThe column count/width of the loaded gate
*/ - public static int readGateFile(Scanner scanner, MapThe two-dimensional list to store the loaded design to
* @returnThe new max columns value of the design
*/ - private static int readGateDesignLine(String line, int maxColumns, MapThe config value map to store to
* @throws ExceptionIf an invalid material is encountered
*/ - private static void readGateConfigValue(String line, MapThe config key to read
* @returnThe read value, or -1 if it could not be read
*/ - public static int readGateConfig(MapThe default material to use, in case the config is invalid
* @returnThe material specified in the config, or the default material if it could not be read
*/ - public static Material readGateConfig(MapThe largest amount of columns in the design
* @returnA matrix containing the gate's layout
*/ - public static Character[][] generateLayoutMatrix(ListThe material to check
* @returnTrue if the material is a wall coral
*/ - public static boolean isWallCoral(Material material) { + public static boolean isWallCoral(@NotNull Material material) { //Unfortunately, there is no tag for dead wall corals, so they need to be checked manually return Tag.WALL_CORALS.isTagged(material) || material.equals(Material.DEAD_BRAIN_CORAL_WALL_FAN) || @@ -34,7 +35,7 @@ public final class MaterialHelper { * @param materialThe material to check
* @returnTrue if the material is a container
*/ - public static boolean isContainer(Material material) { + public static boolean isContainer(@NotNull Material material) { return Tag.SHULKER_BOXES.isTagged(material) || material == Material.CHEST || material == Material.TRAPPED_CHEST || material == Material.ENDER_CHEST; } @@ -45,7 +46,7 @@ public final class MaterialHelper { * @param materialThe material to check
* @returnTrue if the material can be used as a button
*/ - public static boolean isButtonCompatible(Material material) { + public static boolean isButtonCompatible(@NotNull Material material) { return Tag.BUTTONS.isTagged(material) || isWallCoral(material) || isContainer(material); } diff --git a/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java b/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java index f87dc41..2416e98 100644 --- a/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/PermissionHelper.java @@ -7,6 +7,8 @@ import net.knarcraft.stargate.portal.property.PortalOption; import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerMoveEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import static net.knarcraft.stargate.Stargate.getMaxNameNetworkLength; @@ -25,7 +27,7 @@ public final class PermissionHelper { * @param playerThe player opening the portal
* @param portalThe portal to open
*/ - public static void openPortal(Player player, Portal portal) { + public static void openPortal(@NotNull Player player, @NotNull Portal portal) { Portal destination = portal.getPortalActivator().getDestination(); //For an always open portal, no action is necessary @@ -89,7 +91,7 @@ public final class PermissionHelper { * @param denyWhether the player's access has already been denied by a previous check
* @returnFalse if the player should be allowed through the portal
*/ - public static boolean portalAccessDenied(Player player, Portal portal, boolean deny) { + public static boolean portalAccessDenied(@NotNull Player player, @NotNull Portal portal, boolean deny) { StargateAccessEvent event = new StargateAccessEvent(player, portal, deny); Stargate.getInstance().getServer().getPluginManager().callEvent(event); return event.getDeny(); @@ -103,7 +105,8 @@ public final class PermissionHelper { * @param destinationThe portal the user wants to exit from
* @returnFalse if the user is allowed to access the portal
*/ - public static boolean cannotAccessPortal(Player player, Portal entrancePortal, Portal destination) { + public static boolean cannotAccessPortal(@NotNull Player player, @NotNull Portal entrancePortal, + @Nullable Portal destination) { boolean deny = false; if (entrancePortal.getOptions().isBungee()) { @@ -116,10 +119,17 @@ public final class PermissionHelper { //If the player does not have access to the network, deny Stargate.debug("cannotAccessPortal", "Cannot access network"); deny = true; - } else if (PermissionHelper.cannotAccessWorld(player, destination.getWorld().getName())) { - //If the player does not have access to the portal's world, deny - Stargate.debug("cannotAccessPortal", "Cannot access world"); - deny = true; + } else { + if (destination == null) { + //If there is no destination, deny + Stargate.debug("cannotAccessPortal", "Portal has no destination"); + deny = true; + } else if (destination.getWorld() != null && + PermissionHelper.cannotAccessWorld(player, destination.getWorld().getName())) { + //If the player does not have access to the portal's world, deny + Stargate.debug("cannotAccessPortal", "Cannot access world"); + deny = true; + } } //Allow other plugins to override whether the player can access the portal return portalAccessDenied(player, entrancePortal, deny); @@ -134,7 +144,7 @@ public final class PermissionHelper { * @param permissionThe permission to check
* @returnTrue if the player has the permission
*/ - public static boolean hasPermission(Player player, String permission) { + public static boolean hasPermission(@NotNull Player player, @NotNull String permission) { if (Stargate.getStargateConfig().isPermissionDebuggingEnabled()) { Stargate.debug("hasPerm::Permission(" + player.getName() + ")", permission + " => " + player.hasPermission(permission)); @@ -152,7 +162,7 @@ public final class PermissionHelper { * @param permissionThe permission to check
* @returnTrue if the player has the permission implicitly or explicitly
*/ - public static boolean hasPermissionImplicit(Player player, String permission) { + public static boolean hasPermissionImplicit(@NotNull Player player, @NotNull String permission) { if (!player.isPermissionSet(permission)) { if (Stargate.getStargateConfig().isPermissionDebuggingEnabled()) { Stargate.debug("hasPermissionImplicit::Permission", permission + " => implicitly true"); @@ -173,7 +183,7 @@ public final class PermissionHelper { * @param worldThe world the player is trying to access
* @returnFalse if the player should be allowed to access the world
*/ - public static boolean cannotAccessWorld(Player player, String world) { + public static boolean cannotAccessWorld(@NotNull Player player, @NotNull String world) { //The player can access all worlds if (hasPermission(player, "stargate.world")) { //Check if the world permission has been explicitly denied @@ -190,7 +200,7 @@ public final class PermissionHelper { * @param networkThe network to check
* @returnTrue if the player is denied from accessing the network
*/ - public static boolean cannotAccessNetwork(Player player, String network) { + public static boolean cannotAccessNetwork(@NotNull Player player, @NotNull String network) { //The player can access all networks if (hasPermission(player, "stargate.network")) { //Check if the world permission has been explicitly denied @@ -215,7 +225,7 @@ public final class PermissionHelper { * @param serverThe server the player is trying to connect to
* @returnTrue if the player is allowed to access the given server
*/ - public static boolean canAccessServer(Player player, String server) { + public static boolean canAccessServer(@NotNull Player player, @NotNull String server) { //The player can access all servers if (hasPermission(player, "stargate.server")) { //Check if the server permission has been explicitly denied @@ -233,7 +243,7 @@ public final class PermissionHelper { * @param destThe portal the player wants to teleport to
* @returnTrue if the player can travel for free
*/ - public static boolean isFree(Player player, Portal src, Portal dest) { + public static boolean isFree(@NotNull Player player, @NotNull Portal src, @Nullable Portal dest) { //This portal is free if (src.getOptions().isFree()) { return true; @@ -255,7 +265,7 @@ public final class PermissionHelper { * @param portalThe portal to check
* @returnTrue if the given player can see the given portal
*/ - public static boolean canSeePortal(Player player, Portal portal) { + public static boolean canSeePortal(@NotNull Player player, @NotNull Portal portal) { //The portal is not hidden if (!portal.getOptions().isHidden()) { return true; @@ -275,7 +285,7 @@ public final class PermissionHelper { * @param portalThe private portal used
* @returnTrue if the player is allowed to use the portal
*/ - public static boolean canUsePrivatePortal(Player player, Portal portal) { + public static boolean canUsePrivatePortal(@NotNull Player player, @NotNull Portal portal) { //Check if the player is the owner of the gate if (portal.isOwner(player)) { return true; @@ -291,7 +301,7 @@ public final class PermissionHelper { * @param optionThe option the player is trying to use
* @returnTrue if the player is allowed to create a portal with the given option
*/ - public static boolean canUseOption(Player player, PortalOption option) { + public static boolean canUseOption(@NotNull Player player, @NotNull PortalOption option) { return hasPermission(player, option.getPermissionString()); } @@ -302,7 +312,7 @@ public final class PermissionHelper { * @param networkThe network the player is trying to create a gate on
* @returnTrue if the player is allowed to create the new gate
*/ - public static boolean canCreateNetworkGate(Player player, String network) { + public static boolean canCreateNetworkGate(@NotNull Player player, @NotNull String network) { //Check if the player is allowed to create a portal on any network if (hasPermission(player, "stargate.create.network")) { //Check if the network has been explicitly denied @@ -318,7 +328,7 @@ public final class PermissionHelper { * @param playerThe player trying to create the new gate
* @returnTrue if the player is allowed
*/ - public static boolean canCreatePersonalPortal(Player player) { + public static boolean canCreatePersonalPortal(@NotNull Player player) { return hasPermission(player, "stargate.create.personal"); } @@ -329,7 +339,7 @@ public final class PermissionHelper { * @param gateThe gate type of the new portal
* @returnTrue if the player is allowed to create a portal with the given gate layout
*/ - public static boolean canCreatePortal(Player player, String gate) { + public static boolean canCreatePortal(@NotNull Player player, @NotNull String gate) { //Check if the player is allowed to create all gates if (hasPermission(player, "stargate.create.gate")) { //Check if the gate type has been explicitly denied @@ -346,7 +356,7 @@ public final class PermissionHelper { * @param portalThe portal to destroy
* @returnTrue if the player is allowed to destroy the portal
*/ - public static boolean canDestroyPortal(Player player, Portal portal) { + public static boolean canDestroyPortal(@NotNull Player player, @NotNull Portal portal) { String network = portal.getCleanNetwork(); //Use a special check for bungee portals @@ -376,7 +386,8 @@ public final class PermissionHelper { * @param eventThe move event causing the teleportation
* @returnTrue if the player cannot teleport. False otherwise
*/ - public static boolean playerCannotTeleport(Portal entrancePortal, Portal destination, Player player, PlayerMoveEvent event) { + public static boolean playerCannotTeleport(@Nullable Portal entrancePortal, @Nullable Portal destination, + @NotNull Player player, @Nullable PlayerMoveEvent event) { //No portal or not open if (entrancePortal == null || !entrancePortal.isOpen()) { return true; @@ -392,12 +403,13 @@ public final class PermissionHelper { } //No destination - if (!entrancePortal.getOptions().isBungee() && destination == null) { + boolean isBungee = entrancePortal.getOptions().isBungee(); + if (!isBungee && destination == null) { return true; } //Player cannot access portal - if (PermissionHelper.cannotAccessPortal(player, entrancePortal, destination)) { + if (!PermissionHelper.cannotAccessPortal(player, entrancePortal, destination)) { if (!entrancePortal.getOptions().isSilent()) { Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("denyMsg")); } diff --git a/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java b/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java index 6ba84e7..33ca2d5 100644 --- a/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/PortalFileHelper.java @@ -20,6 +20,8 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; import org.bukkit.block.data.Waterlogged; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.BufferedWriter; import java.io.File; @@ -43,7 +45,7 @@ public final class PortalFileHelper { * * @param worldThe world to save portals for
*/ - public static void saveAllPortals(World world) { + public static void saveAllPortals(@NotNull World world) { Stargate.getStargateConfig().addManagedWorld(world.getName()); String saveFileLocation = Stargate.getPortalFolder() + "/" + world.getName() + ".db"; @@ -52,6 +54,11 @@ public final class PortalFileHelper { for (Portal portal : PortalRegistry.getAllPortals()) { //Skip portals in other worlds + if (portal.getWorld() == null) { + Stargate.logSevere(String.format("Could not save portal %s because its world is null", + portal.getName())); + continue; + } String worldName = portal.getWorld().getName(); if (!worldName.equalsIgnoreCase(world.getName())) { continue; @@ -61,8 +68,8 @@ public final class PortalFileHelper { } bufferedWriter.close(); - } catch (Exception e) { - Stargate.logSevere(String.format("Exception while writing stargates to %s: %s", saveFileLocation, e)); + } catch (Exception exception) { + Stargate.logSevere(String.format("Exception while writing stargates to %s: %s", saveFileLocation, exception)); } } @@ -73,13 +80,13 @@ public final class PortalFileHelper { * @param portalThe portal to save
* @throws IOExceptionIf unable to write to the buffered writer
*/ - private static void savePortal(BufferedWriter bufferedWriter, Portal portal) throws IOException { + private static void savePortal(@NotNull BufferedWriter bufferedWriter, @NotNull Portal portal) throws IOException { StringBuilder builder = new StringBuilder(); BlockLocation button = portal.getStructure().getButton(); //WARNING: Because of the primitive save format, any change in order will break everything! builder.append(portal.getName()).append(':'); - builder.append(portal.getSignLocation().toString()).append(':'); + builder.append(portal.getSignLocation()).append(':'); builder.append((button != null) ? button.toString() : "").append(':'); //Add removes config values to keep indices consistent @@ -87,7 +94,7 @@ public final class PortalFileHelper { builder.append(0).append(':'); builder.append(portal.getYaw()).append(':'); - builder.append(portal.getTopLeft().toString()).append(':'); + builder.append(portal.getTopLeft()).append(':'); builder.append(portal.getGate().getFilename()).append(':'); //Only save the destination name if the gate is fixed as it doesn't matter otherwise @@ -111,13 +118,17 @@ public final class PortalFileHelper { * @param portalThe portal to save
* @param builderThe string builder to append to
*/ - private static void savePortalOptions(Portal portal, StringBuilder builder) { + private static void savePortalOptions(@NotNull Portal portal, @NotNull StringBuilder builder) { PortalOptions options = portal.getOptions(); builder.append(':'); builder.append(options.isHidden()).append(':'); builder.append(options.isAlwaysOn()).append(':'); builder.append(options.isPrivate()).append(':'); - builder.append(portal.getWorld().getName()).append(':'); + if (portal.getWorld() != null) { + builder.append(portal.getWorld().getName()).append(':'); + } else { + builder.append(':'); + } builder.append(options.isFree()).append(':'); builder.append(options.isBackwards()).append(':'); builder.append(options.isShown()).append(':'); @@ -134,7 +145,7 @@ public final class PortalFileHelper { * @param worldThe world to load portals for
* @returnTrue if portals could be loaded
*/ - public static boolean loadAllPortals(World world) { + public static boolean loadAllPortals(@NotNull World world) { String location = Stargate.getPortalFolder(); File database = new File(location, world.getName() + ".db"); @@ -154,7 +165,7 @@ public final class PortalFileHelper { * @param databaseThe database file containing the portals
* @returnTrue if the portals were loaded successfully
*/ - private static boolean loadPortals(World world, File database) { + private static boolean loadPortals(@NotNull World world, @NotNull File database) { int lineIndex = 0; try { Scanner scanner = new Scanner(database); @@ -185,7 +196,7 @@ public final class PortalFileHelper { * @param worldThe world for which portals are currently being read
* @returnTrue if the read portal has changed and the world's database needs to be saved
*/ - private static boolean readPortalLine(Scanner scanner, int lineIndex, World world) { + private static boolean readPortalLine(@NotNull Scanner scanner, int lineIndex, @NotNull World world) { String line = scanner.nextLine().trim(); //Ignore empty and comment lines @@ -213,7 +224,7 @@ public final class PortalFileHelper { * @param worldThe world portals have been loaded for
* @param needsToSaveDatabaseWhether the portal database's file needs to be updated
*/ - private static void doPostLoadTasks(World world, boolean needsToSaveDatabase) { + private static void doPostLoadTasks(@NotNull World world, boolean needsToSaveDatabase) { //Open any always-on portals. Do this here as it should be more efficient than in the loop. PortalHandler.verifyAllPortals(); int portalCount = PortalRegistry.getAllPortals().size(); @@ -245,7 +256,7 @@ public final class PortalFileHelper { * @param lineIndexThe line index to report in case the user needs to fix an error
* @returnTrue if the portal's data has changed and its database needs to be updated
*/ - private static boolean loadPortal(String[] portalData, World world, int lineIndex) { + private static boolean loadPortal(@NotNull String[] portalData, @NotNull World world, int lineIndex) { //Load min. required portal data String name = portalData[0]; BlockLocation button = (portalData[2].length() > 0) ? new BlockLocation(world, portalData[2]) : null; @@ -289,17 +300,21 @@ public final class PortalFileHelper { * * @param portalThe portal update the button of
*/ - private static void updatePortalButton(Portal portal) { + private static void updatePortalButton(@NotNull Portal portal) { BlockLocation buttonLocation = getButtonLocation(portal); + if (buttonLocation == null) { + return; + } + if (portal.getOptions().isAlwaysOn()) { - //Clear button if not already air or water + //Clear button if it exists if (MaterialHelper.isButtonCompatible(buttonLocation.getType())) { Material newMaterial = decideRemovalMaterial(buttonLocation, portal); Stargate.addBlockChangeRequest(new BlockChangeRequest(buttonLocation, newMaterial, null)); } } else { - //Replace button if the material does not match - if (buttonLocation.getType() != portal.getGate().getPortalButton()) { + //Replace button if the material is not a button + if (!MaterialHelper.isButtonCompatible(buttonLocation.getType())) { generatePortalButton(portal, DirectionHelper.getBlockFaceFromYaw(portal.getYaw())); } } @@ -312,7 +327,8 @@ public final class PortalFileHelper { * @param portalThe portal the button/sign belongs to
* @returnThe material to use for removing the button/sign
*/ - public static Material decideRemovalMaterial(BlockLocation location, Portal portal) { + @NotNull + public static Material decideRemovalMaterial(@NotNull BlockLocation location, @NotNull Portal portal) { //Get the blocks to each side of the location Location leftLocation = location.getRelativeLocation(-1, 0, 0, portal.getYaw()); Location rightLocation = location.getRelativeLocation(1, 0, 0, portal.getYaw()); @@ -333,7 +349,7 @@ public final class PortalFileHelper { * @param locationThe location to check
* @returnTrue if the location is underwater
*/ - private static boolean isUnderwater(Location location) { + private static boolean isUnderwater(@NotNull Location location) { BlockData blockData = location.getBlock().getBlockData(); return blockData.getMaterial() == Material.WATER || (blockData instanceof Waterlogged waterlogged && waterlogged.isWaterlogged()); @@ -348,7 +364,7 @@ public final class PortalFileHelper { * @param portalThe portal to update the button vector for
* @returnTrue if the calculated button location is not the same as the one in the portal file
*/ - private static boolean updateButtonVector(Portal portal) { + private static boolean updateButtonVector(@NotNull Portal portal) { for (RelativeBlockVector control : portal.getGate().getLayout().getControls()) { BlockLocation controlLocation = portal.getLocation().getTopLeft().getRelativeLocation(control, portal.getYaw()); @@ -374,10 +390,15 @@ public final class PortalFileHelper { * @param portalThe portal to generate button for
* @param buttonFacingThe direction the button should be facing
*/ - public static void generatePortalButton(Portal portal, BlockFace buttonFacing) { + public static void generatePortalButton(@NotNull Portal portal, @NotNull BlockFace buttonFacing) { //Go one block outwards to find the button's location rather than the control block's location BlockLocation button = getButtonLocation(portal); + // If the button location is null here, it is assumed that the button generation wasn't necessary + if (button == null) { + return; + } + Directional buttonData = (Directional) Bukkit.createBlockData(portal.getGate().getPortalButton()); buttonData.setFacing(buttonFacing); button.getBlock().setBlockData(buttonData); @@ -390,11 +411,16 @@ public final class PortalFileHelper { * @param portalThe portal to find the button for
* @returnThe location of the portal's button
*/ - private static BlockLocation getButtonLocation(Portal portal) { + @Nullable + private static BlockLocation getButtonLocation(@NotNull Portal portal) { BlockLocation topLeft = portal.getTopLeft(); RelativeBlockVector buttonVector = portal.getLocation().getButtonVector(); - return topLeft.getRelativeLocation(buttonVector.addToVector(RelativeBlockVector.Property.OUT, 1), - portal.getYaw()); + + if (buttonVector == null) { + return null; + } + + return topLeft.getRelativeLocation(buttonVector.addOut(1), portal.getYaw()); } } diff --git a/src/main/java/net/knarcraft/stargate/utility/SignHelper.java b/src/main/java/net/knarcraft/stargate/utility/SignHelper.java index af6f790..566cc46 100644 --- a/src/main/java/net/knarcraft/stargate/utility/SignHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/SignHelper.java @@ -3,6 +3,8 @@ package net.knarcraft.stargate.utility; import org.bukkit.DyeColor; import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * A helper class for dealing with signs @@ -21,7 +23,8 @@ public final class SignHelper { * @param signThe sign to check
* @returnThe dye currently applied to the sign
*/ - public static DyeColor getDye(Sign sign) { + @Nullable + public static DyeColor getDye(@NotNull Sign sign) { if (HAS_SIGN_SIDES) { return sign.getSide(Side.FRONT).getColor(); } else { @@ -38,7 +41,7 @@ public final class SignHelper { * @param lineThe line to set
* @param textThe text to set
*/ - public static void setSignLine(Sign sign, int line, String text) { + public static void setSignLine(@NotNull Sign sign, int line, @NotNull String text) { if (HAS_SIGN_SIDES) { sign.getSide(Side.FRONT).setLine(line, text); } else { diff --git a/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java b/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java index e3d7747..e748119 100644 --- a/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/TeleportHelper.java @@ -10,6 +10,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -31,7 +32,7 @@ public final class TeleportHelper { * @param playerThe player trying to teleport
* @returnFalse if the player has leashed any creatures that cannot go through the portal
*/ - public static boolean noLeashedCreaturesPreventTeleportation(Player player) { + public static boolean noLeashedCreaturesPreventTeleportation(@NotNull Player player) { //Find any nearby leashed entities to teleport with the player ListThe player to check
* @returnA list of all creatures the player is holding in a leash (lead)
*/ - public static ListThe direction of any passengers exiting the stargate
* @param newVelocityThe new velocity of the teleported passenger
*/ - public static void teleportAndAddPassenger(Entity targetVehicle, Entity passenger, Vector exitDirection, - Vector newVelocity) { + public static void teleportAndAddPassenger(@NotNull Entity targetVehicle, @NotNull Entity passenger, + @NotNull Vector exitDirection, @NotNull Vector newVelocity) { Location passengerExit = targetVehicle.getLocation().clone().setDirection(exitDirection); if (!passenger.teleport(passengerExit)) { Stargate.debug("TeleportHelper::handleVehiclePassengers", "Failed to teleport passenger" + @@ -112,8 +114,9 @@ public final class TeleportHelper { * @param exitRotationThe rotation of any passengers exiting the stargate
* @param newVelocityThe new velocity of the teleported passengers
*/ - public static void handleEntityPassengers(ListThe portal the player is teleporting from
* @param targetThe portal the player is teleporting to
*/ - public static void teleportLeashedCreatures(Player player, Portal origin, Portal target) { + public static void teleportLeashedCreatures(@NotNull Player player, @NotNull Portal origin, @NotNull Portal target) { //If this feature is disabled, just return if (!Stargate.getGateConfig().handleLeashedCreatures()) { return; @@ -171,7 +174,7 @@ public final class TeleportHelper { * @param entitiesThe list of entities to check
* @returnTrue if at least one entity is not a player
*/ - public static boolean containsNonPlayer(ListThe list of entities to check
* @returnTrue if at least one player is present among the passengers
*/ - public static boolean containsPlayer(ListThe entities to check for players
* @returnThe found players
*/ - public static ListThe portal the player is to exit from
* @returnTrue if the player is allowed to teleport and is able to pay necessary fees
*/ - public static boolean playerCanTeleport(Player player, Portal entrancePortal, Portal destinationPortal) { + public static boolean playerCanTeleport(@NotNull Player player, @NotNull Portal entrancePortal, + @NotNull Portal destinationPortal) { //Make sure the user can access the portal if (PermissionHelper.cannotAccessPortal(player, entrancePortal, destinationPortal)) { if (!entrancePortal.getOptions().isSilent()) { diff --git a/src/main/java/net/knarcraft/stargate/utility/UUIDMigrationHelper.java b/src/main/java/net/knarcraft/stargate/utility/UUIDMigrationHelper.java index 4cb4472..0e93892 100644 --- a/src/main/java/net/knarcraft/stargate/utility/UUIDMigrationHelper.java +++ b/src/main/java/net/knarcraft/stargate/utility/UUIDMigrationHelper.java @@ -7,6 +7,7 @@ import net.knarcraft.stargate.portal.PortalRegistry; import net.knarcraft.stargate.portal.property.PortalOwner; import org.bukkit.OfflinePlayer; import org.bukkit.World; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.HashMap; @@ -35,7 +36,7 @@ public final class UUIDMigrationHelper { * * @param playerThe player to migrate
*/ - public static void migrateUUID(OfflinePlayer player) { + public static void migrateUUID(@NotNull OfflinePlayer player) { MapThe portals to migrate
* @param uniqueIdThe unique ID of the portals' owner
*/ - private static void migratePortalsToUUID(ListThe player names to migrate
*/ + @NotNull private static Map