Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
a3ed1058e6 | |||
f70ba24e95 | |||
f6438eb872 | |||
2bf5422b2a | |||
f95ee0b85d | |||
1e06e0e01d | |||
bddf8c55d5 | |||
05a5fb2160 | |||
d9f535cd07 | |||
62952611b8 | |||
29fdc8f849 | |||
043c5f2408 | |||
a74d47e999 | |||
e86be3e848 | |||
366cd3107e | |||
02f6c6e9fc | |||
97670c9367 | |||
2773079a09 | |||
071f1895de | |||
4cae54e46f | |||
7d41b75bac | |||
404b4d0543 | |||
842fd9c452 | |||
2bb0e8670d | |||
acbdcd3ce3 | |||
948f92f140 | |||
5d1d6ffaf0 | |||
a7dc02eef0 | |||
9177773a0e | |||
fc5bac937a | |||
f8ae83bc08 | |||
cfb4910977 | |||
a61a03be33 |
41
README.md
41
README.md
@ -15,6 +15,10 @@ can share a network or be split into clusters; they can be hidden on a network o
|
||||
- **API available** -- using the API, a lot of behavior can be changed
|
||||
- **Button customization** -- a large amount of materials usable as buttons (buttons, wall corals, shulkers, chests)
|
||||
- **Config commands** -- All main config values can be changed from the commandline
|
||||
- **Color customization** -- Stargate signs can be colored in many ways. Colors can be set globally, or on a per sign
|
||||
type basis
|
||||
- **RGB and dye support** -- Signs can use RGB colors (using hex codes) as their main and highlighting colors, and can
|
||||
also be dyed on a per-sign basis
|
||||
|
||||
## Background
|
||||
|
||||
@ -85,6 +89,7 @@ stargate.admin -- Allow all admin features (Hidden/Private bypass, BungeeCord, R
|
||||
stargate.admin.bungee -- Allow the creation of BungeeCord stargates (U option)
|
||||
stargate.admin.reload -- Allow use of the reload command
|
||||
stargate.admin.config -- Allows the player to change config values from the chat
|
||||
stargate.admin.dye -- Allows this player to change the dye of any stargate's sign
|
||||
```
|
||||
|
||||
## Default Permissions
|
||||
@ -294,17 +299,20 @@ while the per-gate costs re defined in the .gate files. To define a certain cost
|
||||
|
||||
```
|
||||
language - The language to use (Included languages: en, de, es, fr, hu, it, nb-no, nl, nn-no, pt-br, ru)
|
||||
adminUpdateAlert - Whether to alert admins about an available update when joining the server
|
||||
folders:
|
||||
portalFolder - The folder your portal databases are saved in
|
||||
gateFolder - The folder containing your .gate files
|
||||
gates:
|
||||
maxGatesEachNetwork - If non-zero, will define the maximum amount of gates allowed on any network.
|
||||
defaultGateNetwork - The default gate network
|
||||
exitVelocity - The velocity to give players exiting stargates, relative to the entry velocity (1 = same as entry velocity)
|
||||
cosmetic:
|
||||
rememberDestination - Whether to set the first destination as the last used destination for all gates
|
||||
sortNetworkDestinations - If true, network lists will be sorted alphabetically.
|
||||
mainSignColor - This allows you to specify the color of the gate signs.
|
||||
highlightSignColor - This allows you to specify the color of the sign markings.
|
||||
mainSignColor - This allows you to specify the color of the gate signs. Use a color code such as WHITE,BLACK,YELLOW or a hex color code such as '#ed76d9'. You need quotes around hex color codes.
|
||||
highlightSignColor - This allows you to specify the color of the sign markings. Use a color code such as WHITE,BLACK,YELLOW or a hex color code such as '#ed76d9'. You need quotes around hex color codes.
|
||||
perSignColors: - A list of per-sign color specifications. Format: "SIGN_TYPE:mainColor,highlight_color". The SIGN_TYPE is OAK for an oak sign, DARK_OAK for a dark oak sign and so on. The colors can be "default" to use the color specified in "mainSignColor" or "highlightSignColor", "inverted" to use the inverse color of the default color, a normal color such as BLACK,WHITE,YELLOW or a hex color code such as #ed76d9.
|
||||
integrity:
|
||||
destroyedByExplosion - Whether to destroy a stargate with explosions, or stop an explosion if it contains a gates controls.
|
||||
verifyPortals - Whether or not all the non-sign blocks are checked to match the gate layout when an old stargate is loaded at startup.
|
||||
@ -389,6 +397,35 @@ portalInfoServer=Server: %server%
|
||||
|
||||
# Changes
|
||||
|
||||
#### \[Version 0.9.3.2] EpicKnarvik97 fork
|
||||
|
||||
- Adds a config option to set the exit velocity of any players exiting a stargate
|
||||
- Adjusts vehicle teleportation a bit to prevent passengers' exit rotation from being wrong
|
||||
- Improves the checking for buggy double-clicks on non-button blocks
|
||||
|
||||
#### \[Version 0.9.3.1] EpicKnarvik97 fork
|
||||
|
||||
- Ignores the type of air when checking if a stargate is valid
|
||||
|
||||
#### \[Version 0.9.3.0] EpicKnarvik97 fork
|
||||
|
||||
- Adds support for RGB colors (use hex color codes)
|
||||
- Adds support for dyed and glowing signs
|
||||
- Adds support for specifying sign colors per sign type
|
||||
- Adds a tab-completable config sub-command for easily changing per-sign colors
|
||||
- Allows a per-sign color to be set as the inverse of the default color of the given type
|
||||
|
||||
#### \[Version 0.9.2.5] EpicKnarvik97 fork
|
||||
|
||||
- Updates Java version to JDK 17
|
||||
- Updates Spigot API version to 1.18
|
||||
|
||||
#### \[Version 0.9.2.4] EpicKnarvik97 fork
|
||||
|
||||
- Adds update checking, which will display a notice in the console when updates are available
|
||||
- Adds an alert about an available update when an admin joins the server
|
||||
- Adds the adminUpdateAlert config option to allow the admin notices to be turned off
|
||||
|
||||
#### \[Version 0.9.2.3] EpicKnarvik97 fork
|
||||
|
||||
- Fixes a typo which caused both colors to change into the highlightSignColor
|
||||
|
16
pom.xml
16
pom.xml
@ -4,7 +4,7 @@
|
||||
|
||||
<groupId>net.knarcraft</groupId>
|
||||
<artifactId>Stargate</artifactId>
|
||||
<version>0.9.2.3</version>
|
||||
<version>0.9.3.2</version>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
@ -15,8 +15,8 @@
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>16</maven.compiler.source>
|
||||
<maven.compiler.target>16</maven.compiler.target>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
@ -34,7 +34,7 @@
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.17.1-R0.1-SNAPSHOT</version>
|
||||
<version>1.18.1-R0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.milkbowl.vault</groupId>
|
||||
@ -49,8 +49,8 @@
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.seeseemelk</groupId>
|
||||
<artifactId>MockBukkit-v1.17</artifactId>
|
||||
<version>1.7.0</version>
|
||||
<artifactId>MockBukkit-v1.18</artifactId>
|
||||
<version>1.14.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -75,8 +75,8 @@
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.6.1</version>
|
||||
<configuration>
|
||||
<source>16</source>
|
||||
<target>16</target>
|
||||
<source>17</source>
|
||||
<target>17</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
@ -21,6 +21,7 @@ import net.knarcraft.stargate.portal.PortalRegistry;
|
||||
import net.knarcraft.stargate.thread.BlockChangeThread;
|
||||
import net.knarcraft.stargate.thread.ChunkUnloadThread;
|
||||
import net.knarcraft.stargate.thread.StarGateThread;
|
||||
import net.knarcraft.stargate.utility.UpdateChecker;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
@ -55,6 +56,8 @@ public class Stargate extends JavaPlugin {
|
||||
private static PluginManager pluginManager;
|
||||
private static StargateConfig stargateConfig;
|
||||
|
||||
private static String updateAvailable = null;
|
||||
|
||||
/**
|
||||
* Empty constructor necessary for Spigot
|
||||
*/
|
||||
@ -74,6 +77,26 @@ public class Stargate extends JavaPlugin {
|
||||
super(loader, descriptionFile, dataFolder, file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores information about an available update
|
||||
*
|
||||
* <p>If a non-null version is given, joining admins will be alerted about the new update.</p>
|
||||
*
|
||||
* @param version <p>The version of the new update available</p>
|
||||
*/
|
||||
public static void setUpdateAvailable(String version) {
|
||||
updateAvailable = version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets information about an available update
|
||||
*
|
||||
* @return <p>The version number if an update is available. Null otherwise</p>
|
||||
*/
|
||||
public static String getUpdateAvailable() {
|
||||
return updateAvailable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an instance of this plugin
|
||||
*
|
||||
@ -316,6 +339,9 @@ public class Stargate extends JavaPlugin {
|
||||
PluginDescriptionFile pluginDescriptionFile = this.getDescription();
|
||||
pluginManager = getServer().getPluginManager();
|
||||
FileConfiguration newConfig = this.getConfig();
|
||||
this.saveDefaultConfig();
|
||||
newConfig.options().copyDefaults(true);
|
||||
|
||||
logger = Logger.getLogger("Minecraft");
|
||||
Server server = getServer();
|
||||
stargate = this;
|
||||
@ -334,6 +360,9 @@ public class Stargate extends JavaPlugin {
|
||||
runThreads();
|
||||
|
||||
this.registerCommands();
|
||||
|
||||
//Check for any available updates
|
||||
UpdateChecker.checkForUpdate();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,7 @@
|
||||
package net.knarcraft.stargate.command;
|
||||
|
||||
import net.knarcraft.stargate.Stargate;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
@ -3,10 +3,13 @@ package net.knarcraft.stargate.command;
|
||||
import net.knarcraft.stargate.Stargate;
|
||||
import net.knarcraft.stargate.config.ConfigOption;
|
||||
import net.knarcraft.stargate.config.ConfigTag;
|
||||
import net.knarcraft.stargate.config.OptionDataType;
|
||||
import net.knarcraft.stargate.portal.Portal;
|
||||
import net.knarcraft.stargate.portal.PortalRegistry;
|
||||
import net.knarcraft.stargate.portal.PortalSignDrawer;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -14,6 +17,9 @@ import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This command represents the config command for changing config values
|
||||
*/
|
||||
@ -35,7 +41,11 @@ public class CommandConfig implements CommandExecutor {
|
||||
return false;
|
||||
}
|
||||
if (args.length > 1) {
|
||||
updateConfigValue(selectedOption, commandSender, args[1]);
|
||||
if (selectedOption.getDataType() == OptionDataType.STRING_LIST) {
|
||||
updateListConfigValue(selectedOption, commandSender, args);
|
||||
} else {
|
||||
updateConfigValue(selectedOption, commandSender, args[1]);
|
||||
}
|
||||
} else {
|
||||
//Display info and the current value of the given config value
|
||||
printConfigOptionValue(commandSender, selectedOption);
|
||||
@ -61,7 +71,7 @@ public class CommandConfig implements CommandExecutor {
|
||||
//Validate any sign colors
|
||||
if (ConfigTag.COLOR.isTagged(selectedOption)) {
|
||||
try {
|
||||
ChatColor.valueOf(value.toUpperCase());
|
||||
ChatColor.of(value.toUpperCase());
|
||||
} catch (IllegalArgumentException | NullPointerException ignored) {
|
||||
commandSender.sendMessage(ChatColor.RED + "Invalid color given");
|
||||
return;
|
||||
@ -70,14 +80,7 @@ public class CommandConfig implements CommandExecutor {
|
||||
|
||||
//Store the config values, accounting for the data type
|
||||
switch (selectedOption.getDataType()) {
|
||||
case BOOLEAN -> {
|
||||
boolean newValue = Boolean.parseBoolean(value);
|
||||
if (selectedOption == ConfigOption.ENABLE_BUNGEE && newValue != Stargate.getGateConfig().enableBungee()) {
|
||||
Stargate.getStargateConfig().startStopBungeeListener(newValue);
|
||||
}
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, newValue);
|
||||
configuration.set(selectedOption.getConfigNode(), newValue);
|
||||
}
|
||||
case BOOLEAN -> updateBooleanConfigValue(selectedOption, value, configuration);
|
||||
case INTEGER -> {
|
||||
Integer intValue = getInteger(commandSender, selectedOption, value);
|
||||
if (intValue == null) {
|
||||
@ -87,23 +90,17 @@ public class CommandConfig implements CommandExecutor {
|
||||
configuration.set(selectedOption.getConfigNode(), intValue);
|
||||
}
|
||||
}
|
||||
case DOUBLE -> {
|
||||
Double doubleValue = getDouble(commandSender, selectedOption, value);
|
||||
if (doubleValue == null) {
|
||||
return;
|
||||
} else {
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, doubleValue);
|
||||
configuration.set(selectedOption.getConfigNode(), doubleValue);
|
||||
}
|
||||
}
|
||||
case STRING -> {
|
||||
if (selectedOption == ConfigOption.GATE_FOLDER || selectedOption == ConfigOption.PORTAL_FOLDER ||
|
||||
selectedOption == ConfigOption.DEFAULT_GATE_NETWORK) {
|
||||
if (value.contains("../") || value.contains("..\\")) {
|
||||
commandSender.sendMessage(ChatColor.RED + "Path traversal characters cannot be used");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (ConfigTag.COLOR.isTagged(selectedOption)) {
|
||||
if (!registerColor(selectedOption, value, commandSender)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (selectedOption == ConfigOption.LANGUAGE) {
|
||||
Stargate.getStargateConfig().getLanguageLoader().setChosenLanguage(value);
|
||||
}
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, value);
|
||||
updateStringConfigValue(selectedOption, commandSender, value);
|
||||
configuration.set(selectedOption.getConfigNode(), value);
|
||||
}
|
||||
default -> {
|
||||
@ -112,6 +109,149 @@ public class CommandConfig implements CommandExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
saveAndReload(selectedOption, commandSender);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a boolean config value
|
||||
*
|
||||
* @param selectedOption <p>The option which should be updated</p>
|
||||
* @param value <p>The new value of the config option</p>
|
||||
* @param configuration <p>The configuration file to save to</p>
|
||||
*/
|
||||
private void updateBooleanConfigValue(ConfigOption selectedOption, String value, FileConfiguration configuration) {
|
||||
boolean newValue = Boolean.parseBoolean(value);
|
||||
if (selectedOption == ConfigOption.ENABLE_BUNGEE && newValue != Stargate.getGateConfig().enableBungee()) {
|
||||
Stargate.getStargateConfig().startStopBungeeListener(newValue);
|
||||
}
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, newValue);
|
||||
configuration.set(selectedOption.getConfigNode(), newValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a string config value
|
||||
*
|
||||
* @param selectedOption <p>The option which should be updated</p>
|
||||
* @param commandSender <p>The command sender that changed the value</p>
|
||||
* @param value <p>The new value of the config option</p>
|
||||
*/
|
||||
private void updateStringConfigValue(ConfigOption selectedOption, CommandSender commandSender, String value) {
|
||||
if (selectedOption == ConfigOption.GATE_FOLDER || selectedOption == ConfigOption.PORTAL_FOLDER ||
|
||||
selectedOption == ConfigOption.DEFAULT_GATE_NETWORK) {
|
||||
if (value.contains("../") || value.contains("..\\")) {
|
||||
commandSender.sendMessage(ChatColor.RED + "Path traversal characters cannot be used");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (ConfigTag.COLOR.isTagged(selectedOption)) {
|
||||
if (!registerColor(selectedOption, value, commandSender)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (selectedOption == ConfigOption.LANGUAGE) {
|
||||
Stargate.getStargateConfig().getLanguageLoader().setChosenLanguage(value);
|
||||
}
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a config value
|
||||
*
|
||||
* @param selectedOption <p>The option which should be updated</p>
|
||||
* @param commandSender <p>The command sender that changed the value</p>
|
||||
* @param arguments <p>The arguments for the new config option</p>
|
||||
*/
|
||||
private void updateListConfigValue(ConfigOption selectedOption, CommandSender commandSender, String[] arguments) {
|
||||
FileConfiguration configuration = Stargate.getInstance().getConfig();
|
||||
|
||||
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
|
||||
if (arguments.length < 4) {
|
||||
Stargate.getMessageSender().sendErrorMessage(commandSender, "Usage: /sg config perSignColors " +
|
||||
"<SIGN_TYPE> <MAIN_COLOR> <HIGHLIGHTING_COLOR>");
|
||||
return;
|
||||
}
|
||||
|
||||
String colorString = parsePerSignColorInput(commandSender, arguments);
|
||||
if (colorString == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//Update the per-sign colors according to input
|
||||
updatePerSignColors(arguments[1], colorString, configuration);
|
||||
}
|
||||
|
||||
saveAndReload(selectedOption, commandSender);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the input given for changing the per-color string
|
||||
*
|
||||
* @param commandSender <p>The command sender that triggered the command</p>
|
||||
* @param arguments <p>The arguments given by the user</p>
|
||||
* @return <p>The per-sign color string to update with, or null if the input was invalid</p>
|
||||
*/
|
||||
private String parsePerSignColorInput(CommandSender commandSender, String[] arguments) {
|
||||
//Make sure the sign type is an actual sign
|
||||
if (Material.matchMaterial(arguments[1] + "_SIGN") == null) {
|
||||
Stargate.getMessageSender().sendErrorMessage(commandSender, "The given sign type is invalid");
|
||||
return null;
|
||||
}
|
||||
String colorString = arguments[1] + ":";
|
||||
|
||||
//Validate the colors given by the user
|
||||
String[] errorMessage = new String[]{"The given main sign color is invalid!", "The given highlight sign color is invalid!"};
|
||||
String[] newColors = new String[2];
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (validatePerSignColor(arguments[i + 2])) {
|
||||
newColors[i] = arguments[i + 2];
|
||||
} else {
|
||||
Stargate.getMessageSender().sendErrorMessage(commandSender, errorMessage[i]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
colorString += String.join(",", newColors);
|
||||
return colorString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the per-sign colors with the given input
|
||||
*
|
||||
* @param signType <p>The sign type that is updated</p>
|
||||
* @param colorString <p>The new color string to replace any previous value with</p>
|
||||
* @param configuration <p>The file configuration to update with the new per-sign colors</p>
|
||||
*/
|
||||
private void updatePerSignColors(String signType, String colorString, FileConfiguration configuration) {
|
||||
List<String> newColorStrings = new ArrayList<>();
|
||||
List<?> oldColors = (List<?>) Stargate.getStargateConfig().getConfigOptionsReference().get(ConfigOption.PER_SIGN_COLORS);
|
||||
for (Object object : oldColors) {
|
||||
newColorStrings.add(String.valueOf(object));
|
||||
}
|
||||
newColorStrings.removeIf((item) -> item.startsWith(signType));
|
||||
newColorStrings.add(colorString);
|
||||
|
||||
Stargate.getStargateConfig().getConfigOptionsReference().put(ConfigOption.PER_SIGN_COLORS, newColorStrings);
|
||||
configuration.set(ConfigOption.PER_SIGN_COLORS.getConfigNode(), newColorStrings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to validate one of the colors given when changing per-sign colors
|
||||
*
|
||||
* @param color <p>The color chosen by the user</p>
|
||||
* @return <p>True if the given color is valid</p>
|
||||
*/
|
||||
private boolean validatePerSignColor(String color) {
|
||||
ChatColor newHighlightColor = parseColor(color);
|
||||
return newHighlightColor != null || color.equalsIgnoreCase("default") ||
|
||||
color.equalsIgnoreCase("inverted");
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the configuration file and reloads as necessary
|
||||
*
|
||||
* @param selectedOption <p>The config option that was changed</p>
|
||||
* @param commandSender <p>The command sender that executed the config command</p>
|
||||
*/
|
||||
private void saveAndReload(ConfigOption selectedOption, CommandSender commandSender) {
|
||||
//Save the config file and reload if necessary
|
||||
Stargate.getInstance().saveConfig();
|
||||
|
||||
@ -153,7 +293,7 @@ public class CommandConfig implements CommandExecutor {
|
||||
*/
|
||||
private ChatColor parseColor(String value) {
|
||||
try {
|
||||
return ChatColor.valueOf(value.toUpperCase());
|
||||
return ChatColor.of(value.toUpperCase());
|
||||
} catch (IllegalArgumentException | NullPointerException ignored) {
|
||||
return null;
|
||||
}
|
||||
@ -183,6 +323,30 @@ public class CommandConfig implements CommandExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a double from a string
|
||||
*
|
||||
* @param commandSender <p>The command sender that sent the config command</p>
|
||||
* @param selectedOption <p>The option the command sender is trying to change</p>
|
||||
* @param value <p>The value given</p>
|
||||
* @return <p>A double, or null if it was invalid</p>
|
||||
*/
|
||||
private Double getDouble(CommandSender commandSender, ConfigOption selectedOption, String value) {
|
||||
try {
|
||||
double doubleValue = Double.parseDouble(value);
|
||||
|
||||
if (selectedOption == ConfigOption.EXIT_VELOCITY && doubleValue < 0) {
|
||||
commandSender.sendMessage(ChatColor.RED + "This config option cannot be negative.");
|
||||
return null;
|
||||
}
|
||||
|
||||
return doubleValue;
|
||||
} catch (NumberFormatException exception) {
|
||||
commandSender.sendMessage(ChatColor.RED + "Invalid number given");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reloads the config if necessary
|
||||
*
|
||||
@ -193,20 +357,27 @@ public class CommandConfig implements CommandExecutor {
|
||||
if (ConfigTag.requiresFullReload(configOption)) {
|
||||
//Reload everything
|
||||
Stargate.getStargateConfig().reload(commandSender);
|
||||
} else if (ConfigTag.requiresPortalReload(configOption)) {
|
||||
//Just unload and reload the portals
|
||||
Stargate.getStargateConfig().unloadAllPortals();
|
||||
Stargate.getStargateConfig().loadAllPortals();
|
||||
} else if (ConfigTag.requiresLanguageReload(configOption)) {
|
||||
//Reload the language loader
|
||||
Stargate.getStargateConfig().getLanguageLoader().reload();
|
||||
//Re-draw all portal signs
|
||||
for (Portal portal : PortalRegistry.getAllPortals()) {
|
||||
portal.drawSign();
|
||||
} else {
|
||||
if (ConfigTag.requiresColorReload(configOption)) {
|
||||
Stargate.getStargateConfig().getStargateGateConfig().loadPerSignColors();
|
||||
}
|
||||
if (ConfigTag.requiresPortalReload(configOption)) {
|
||||
//Just unload and reload the portals
|
||||
Stargate.getStargateConfig().unloadAllPortals();
|
||||
Stargate.getStargateConfig().loadAllPortals();
|
||||
}
|
||||
if (ConfigTag.requiresLanguageReload(configOption)) {
|
||||
//Reload the language loader
|
||||
Stargate.getStargateConfig().getLanguageLoader().reload();
|
||||
//Re-draw all portal signs
|
||||
for (Portal portal : PortalRegistry.getAllPortals()) {
|
||||
portal.drawSign();
|
||||
}
|
||||
}
|
||||
if (ConfigTag.requiresEconomyReload(configOption)) {
|
||||
//Load or unload Vault and Economy as necessary
|
||||
Stargate.getStargateConfig().reloadEconomy();
|
||||
}
|
||||
} else if (ConfigTag.requiresEconomyReload(configOption)) {
|
||||
//Load or unload Vault and Economy as necessary
|
||||
Stargate.getStargateConfig().reloadEconomy();
|
||||
}
|
||||
}
|
||||
|
||||
@ -242,8 +413,13 @@ public class CommandConfig implements CommandExecutor {
|
||||
* @return <p>A string describing the config option</p>
|
||||
*/
|
||||
private String getOptionDescription(ConfigOption option) {
|
||||
Object defaultValue = option.getDefaultValue();
|
||||
String stringValue = String.valueOf(defaultValue);
|
||||
if (option.getDataType() == OptionDataType.STRING_LIST) {
|
||||
stringValue = "[" + StringUtils.join((String[]) defaultValue, ",") + "]";
|
||||
}
|
||||
return ChatColor.GOLD + option.getName() + ChatColor.WHITE + " - " + ChatColor.GREEN + option.getDescription() +
|
||||
ChatColor.DARK_GRAY + " (Default: " + ChatColor.GRAY + option.getDefaultValue() + ChatColor.DARK_GRAY + ")";
|
||||
ChatColor.DARK_GRAY + " (Default: " + ChatColor.GRAY + stringValue + ChatColor.DARK_GRAY + ")";
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
package net.knarcraft.stargate.command;
|
||||
|
||||
import net.knarcraft.stargate.Stargate;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.apache.commons.lang.ArrayUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
@ -2,7 +2,9 @@ package net.knarcraft.stargate.command;
|
||||
|
||||
import net.knarcraft.stargate.config.ConfigOption;
|
||||
import net.knarcraft.stargate.config.OptionDataType;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Tag;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
@ -17,15 +19,27 @@ import java.util.List;
|
||||
*/
|
||||
public class ConfigTabCompleter implements TabCompleter {
|
||||
|
||||
private List<String> signTypes;
|
||||
private List<String> booleans;
|
||||
private List<String> integers;
|
||||
private List<String> chatColors;
|
||||
private List<String> languages;
|
||||
private List<String> extendedColors;
|
||||
private List<String> doubles;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
|
||||
@NotNull String[] args) {
|
||||
|
||||
if (signTypes == null || booleans == null || integers == null || chatColors == null || languages == null) {
|
||||
initializeAutoCompleteLists();
|
||||
}
|
||||
if (args.length > 1) {
|
||||
ConfigOption selectedOption = ConfigOption.getByName(args[0]);
|
||||
if (selectedOption == null) {
|
||||
return new ArrayList<>();
|
||||
} else if (selectedOption.getDataType() == OptionDataType.STRING_LIST) {
|
||||
return getPossibleStringListOptionValues(selectedOption, args);
|
||||
} else {
|
||||
return getPossibleOptionValues(selectedOption, args[1]);
|
||||
}
|
||||
@ -63,18 +77,10 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
* @return <p>Some or all of the valid values for the option</p>
|
||||
*/
|
||||
private List<String> getPossibleOptionValues(ConfigOption selectedOption, String typedText) {
|
||||
List<String> booleans = new ArrayList<>();
|
||||
booleans.add("true");
|
||||
booleans.add("false");
|
||||
|
||||
List<String> numbers = new ArrayList<>();
|
||||
numbers.add("0");
|
||||
numbers.add("5");
|
||||
|
||||
switch (selectedOption) {
|
||||
case LANGUAGE:
|
||||
//Return available languages
|
||||
return filterMatching(getLanguages(), typedText);
|
||||
return filterMatching(languages, typedText);
|
||||
case GATE_FOLDER:
|
||||
case PORTAL_FOLDER:
|
||||
case DEFAULT_GATE_NETWORK:
|
||||
@ -88,7 +94,7 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
case HIGHLIGHT_SIGN_COLOR:
|
||||
case FREE_GATES_COLOR:
|
||||
//Return all colors
|
||||
return filterMatching(getColors(), typedText);
|
||||
return filterMatching(chatColors, typedText);
|
||||
}
|
||||
|
||||
//If the config value is a boolean, show the two boolean values
|
||||
@ -99,53 +105,115 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
//If the config value is an integer, display some valid numbers
|
||||
if (selectedOption.getDataType() == OptionDataType.INTEGER) {
|
||||
if (typedText.trim().isEmpty()) {
|
||||
return numbers;
|
||||
return integers;
|
||||
} else {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
|
||||
//If the config value is a double, display some valid numbers
|
||||
if (selectedOption.getDataType() == OptionDataType.DOUBLE) {
|
||||
if (typedText.trim().isEmpty()) {
|
||||
return doubles;
|
||||
} else {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all available languages
|
||||
* Get possible values for the selected string list option
|
||||
*
|
||||
* @return <p>The available languages</p>
|
||||
* @param selectedOption <p>The selected option</p>
|
||||
* @param args <p>The arguments given by the user</p>
|
||||
* @return <p>Some or all of the valid values for the option</p>
|
||||
*/
|
||||
private List<String> getLanguages() {
|
||||
List<String> languages = new ArrayList<>();
|
||||
languages.add("de");
|
||||
languages.add("en");
|
||||
languages.add("es");
|
||||
languages.add("fr");
|
||||
languages.add("hu");
|
||||
languages.add("it");
|
||||
languages.add("nb-no");
|
||||
languages.add("nl");
|
||||
languages.add("nn-no");
|
||||
languages.add("pt-br");
|
||||
languages.add("ru");
|
||||
return languages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all available colors
|
||||
*
|
||||
* @return <p>All available colors</p>
|
||||
*/
|
||||
private List<String> getColors() {
|
||||
List<String> colors = new ArrayList<>();
|
||||
for (ChatColor color : getChatColors()) {
|
||||
colors.add(color.name());
|
||||
private List<String> getPossibleStringListOptionValues(ConfigOption selectedOption, String[] args) {
|
||||
if (selectedOption == ConfigOption.PER_SIGN_COLORS) {
|
||||
return getPerSignColorCompletion(args);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
return colors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a list of all available chat colors
|
||||
* Gets the tab completion values for completing the per-sign color text
|
||||
*
|
||||
* @return <p>A list of chat colors</p>
|
||||
* @param args <p>The arguments given by the user</p>
|
||||
* @return <p>The options to give the user</p>
|
||||
*/
|
||||
private List<String> getPerSignColorCompletion(String[] args) {
|
||||
if (args.length < 3) {
|
||||
return filterMatching(signTypes, args[1]);
|
||||
} else if (args.length < 4) {
|
||||
return filterMatching(extendedColors, args[2]);
|
||||
} else if (args.length < 5) {
|
||||
return filterMatching(extendedColors, args[3]);
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts a single string value into a string list
|
||||
*
|
||||
* @param value <p>The string to make into a list</p>
|
||||
* @return <p>A list containing the string value</p>
|
||||
*/
|
||||
private List<String> putStringInList(String value) {
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add(value);
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes all lists of auto-completable values
|
||||
*/
|
||||
private void initializeAutoCompleteLists() {
|
||||
booleans = new ArrayList<>();
|
||||
booleans.add("true");
|
||||
booleans.add("false");
|
||||
|
||||
integers = new ArrayList<>();
|
||||
integers.add("0");
|
||||
integers.add("5");
|
||||
|
||||
signTypes = new ArrayList<>();
|
||||
for (Material material : Material.values()) {
|
||||
if (Tag.STANDING_SIGNS.isTagged(material)) {
|
||||
signTypes.add(material.toString().replace("_SIGN", ""));
|
||||
}
|
||||
}
|
||||
|
||||
getColors();
|
||||
initializeLanguages();
|
||||
|
||||
extendedColors = new ArrayList<>(chatColors);
|
||||
extendedColors.add("default");
|
||||
extendedColors.add("inverted");
|
||||
|
||||
doubles = new ArrayList<>();
|
||||
doubles.add("5");
|
||||
doubles.add("1");
|
||||
doubles.add("0.5");
|
||||
doubles.add("0.1");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initializes the list of chat colors
|
||||
*/
|
||||
private void getColors() {
|
||||
chatColors = new ArrayList<>();
|
||||
for (ChatColor color : getChatColors()) {
|
||||
chatColors.add(color.getName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets available chat colors
|
||||
*
|
||||
* @return <p>The available chat colors</p>
|
||||
*/
|
||||
private List<ChatColor> getChatColors() {
|
||||
List<ChatColor> chatColors = new ArrayList<>();
|
||||
@ -165,19 +233,29 @@ public class ConfigTabCompleter implements TabCompleter {
|
||||
chatColors.add(ChatColor.DARK_GRAY);
|
||||
chatColors.add(ChatColor.GRAY);
|
||||
chatColors.add(ChatColor.YELLOW);
|
||||
chatColors.add(ChatColor.of("#ed76d9"));
|
||||
chatColors.add(ChatColor.of("#ffecb7"));
|
||||
return chatColors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts a single string value into a string list
|
||||
*
|
||||
* @param value <p>The string to make into a list</p>
|
||||
* @return <p>A list containing the string value</p>
|
||||
* Initializes the list of all available languages
|
||||
*/
|
||||
private List<String> putStringInList(String value) {
|
||||
List<String> list = new ArrayList<>();
|
||||
list.add(value);
|
||||
return list;
|
||||
private void initializeLanguages() {
|
||||
languages = new ArrayList<>();
|
||||
languages.add("de");
|
||||
languages.add("en");
|
||||
languages.add("es");
|
||||
languages.add("fr");
|
||||
languages.add("hu");
|
||||
languages.add("it");
|
||||
languages.add("nb-no");
|
||||
languages.add("nl");
|
||||
languages.add("nn-no");
|
||||
languages.add("pt-br");
|
||||
languages.add("ru");
|
||||
//TODO: Generate this list dynamically by listing the language files in the jar and adding the user's custom
|
||||
// language files
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -50,6 +50,10 @@ public enum ConfigOption {
|
||||
*/
|
||||
HIGHLIGHT_SIGN_COLOR("gates.cosmetic.highlightSignColor", "The text color used for highlighting stargate signs", "WHITE"),
|
||||
|
||||
PER_SIGN_COLORS("gates.cosmetic.perSignColors", "The per-sign color specification", new String[]{
|
||||
"'ACACIA:default,default'", "'BIRCH:default,default'", "'CRIMSON:inverted,inverted'", "'DARK_OAK:inverted,inverted'",
|
||||
"'JUNGLE:default,default'", "'OAK:default,default'", "'SPRUCE:inverted,inverted'", "'WARPED:inverted,inverted'"}),
|
||||
|
||||
/**
|
||||
* Whether to destroy portals when any blocks are broken by explosions
|
||||
*/
|
||||
@ -147,8 +151,17 @@ public enum ConfigOption {
|
||||
/**
|
||||
* Whether to enable debug output for debugging permissions
|
||||
*/
|
||||
PERMISSION_DEBUG("debugging.permissionDebug", "Whether to enable permission debugging output", false);
|
||||
PERMISSION_DEBUG("debugging.permissionDebug", "Whether to enable permission debugging output", false),
|
||||
|
||||
/**
|
||||
* Whether to alert admins about new updates
|
||||
*/
|
||||
ADMIN_UPDATE_ALERT("adminUpdateAlert", "Whether to alert admins about new plugin updates", true),
|
||||
|
||||
/**
|
||||
* The velocity of players exiting a stargate, relative to the entry velocity
|
||||
*/
|
||||
EXIT_VELOCITY("gates.exitVelocity", "The velocity of players exiting stargates, relative to the entry velocity", 0.1D);
|
||||
|
||||
private final String configNode;
|
||||
private final String description;
|
||||
@ -167,14 +180,18 @@ public enum ConfigOption {
|
||||
this.description = description;
|
||||
this.defaultValue = defaultValue;
|
||||
|
||||
if (defaultValue instanceof String) {
|
||||
if (defaultValue instanceof String[]) {
|
||||
this.dataType = OptionDataType.STRING_LIST;
|
||||
} else if (defaultValue instanceof String) {
|
||||
this.dataType = OptionDataType.STRING;
|
||||
} else if (defaultValue instanceof Boolean) {
|
||||
this.dataType = OptionDataType.BOOLEAN;
|
||||
} else if (defaultValue instanceof Integer) {
|
||||
this.dataType = OptionDataType.INTEGER;
|
||||
} else if (defaultValue instanceof Double) {
|
||||
this.dataType = OptionDataType.DOUBLE;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown config data type encountered.");
|
||||
throw new IllegalArgumentException("Unknown config data type encountered: " + defaultValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,8 @@ import java.util.Arrays;
|
||||
*/
|
||||
public enum ConfigTag {
|
||||
|
||||
COLOR(new ConfigOption[]{ConfigOption.FREE_GATES_COLOR, ConfigOption.MAIN_SIGN_COLOR, ConfigOption.HIGHLIGHT_SIGN_COLOR}),
|
||||
COLOR(new ConfigOption[]{ConfigOption.FREE_GATES_COLOR, ConfigOption.MAIN_SIGN_COLOR,
|
||||
ConfigOption.HIGHLIGHT_SIGN_COLOR, ConfigOption.PER_SIGN_COLORS}),
|
||||
FOLDER(new ConfigOption[]{ConfigOption.GATE_FOLDER, ConfigOption.PORTAL_FOLDER});
|
||||
|
||||
private final ConfigOption[] taggedOptions;
|
||||
@ -31,6 +32,16 @@ public enum ConfigTag {
|
||||
return Arrays.stream(taggedOptions).anyMatch((item) -> item == option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a given config option requires a "reload of colors" to take effect
|
||||
*
|
||||
* @param configOption <p>The config option to check</p>
|
||||
* @return <p>True if changing the config option requires a "reload of colors" to take effect</p>
|
||||
*/
|
||||
public static boolean requiresColorReload(ConfigOption configOption) {
|
||||
return (COLOR.isTagged(configOption) && configOption != ConfigOption.FREE_GATES_COLOR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a given config option requires a full reload to take effect
|
||||
*
|
||||
|
@ -4,8 +4,8 @@ import net.knarcraft.stargate.Stargate;
|
||||
import net.knarcraft.stargate.portal.PortalSignDrawer;
|
||||
import net.knarcraft.stargate.portal.property.gate.Gate;
|
||||
import net.knarcraft.stargate.utility.PermissionHelper;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
@ -33,7 +33,7 @@ public final class EconomyConfig {
|
||||
this.configOptions = configOptions;
|
||||
try {
|
||||
String freeColor = (String) configOptions.get(ConfigOption.FREE_GATES_COLOR);
|
||||
PortalSignDrawer.setFreeColor(ChatColor.valueOf(freeColor.toUpperCase()));
|
||||
PortalSignDrawer.setFreeColor(ChatColor.of(freeColor.toUpperCase()));
|
||||
} catch (IllegalArgumentException | NullPointerException ignored) {
|
||||
PortalSignDrawer.setFreeColor(ChatColor.DARK_GREEN);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package net.knarcraft.stargate.config;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
/**
|
||||
|
@ -6,16 +6,28 @@ package net.knarcraft.stargate.config;
|
||||
public enum OptionDataType {
|
||||
|
||||
/**
|
||||
* The data type for the option is a String
|
||||
* The data type if the option is a String
|
||||
*/
|
||||
STRING,
|
||||
|
||||
/**
|
||||
* The data type for the option is a Boolean
|
||||
* The data type if the option is a Boolean
|
||||
*/
|
||||
BOOLEAN,
|
||||
|
||||
/**
|
||||
* The data type for the option is an Integer
|
||||
* The data type if the option is a string list
|
||||
*/
|
||||
INTEGER
|
||||
STRING_LIST,
|
||||
|
||||
/**
|
||||
* The data type if the option is an Integer
|
||||
*/
|
||||
INTEGER,
|
||||
|
||||
/**
|
||||
* The data type if the option is a double
|
||||
*/
|
||||
DOUBLE
|
||||
|
||||
}
|
||||
|
@ -319,6 +319,15 @@ public final class StargateConfig {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets whether admins should be alerted about new plugin updates
|
||||
*
|
||||
* @return <p>Whether admins should be alerted about new updates</p>
|
||||
*/
|
||||
public boolean alertAdminsAboutUpdates() {
|
||||
return (boolean) configOptions.get(ConfigOption.ADMIN_UPDATE_ALERT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all config values
|
||||
*/
|
||||
@ -342,12 +351,14 @@ public final class StargateConfig {
|
||||
|
||||
//Load the option using its correct data type
|
||||
switch (option.getDataType()) {
|
||||
case STRING_LIST -> optionValue = newConfig.getStringList(configNode);
|
||||
case STRING -> {
|
||||
String value = newConfig.getString(configNode);
|
||||
optionValue = value != null ? value.trim() : "";
|
||||
}
|
||||
case BOOLEAN -> optionValue = newConfig.getBoolean(configNode);
|
||||
case INTEGER -> optionValue = newConfig.getInt(configNode);
|
||||
case DOUBLE -> optionValue = newConfig.getDouble(configNode);
|
||||
default -> throw new IllegalArgumentException("Invalid config data type encountered");
|
||||
}
|
||||
configOptions.put(option, optionValue);
|
||||
|
@ -2,8 +2,14 @@ package net.knarcraft.stargate.config;
|
||||
|
||||
import net.knarcraft.stargate.Stargate;
|
||||
import net.knarcraft.stargate.portal.PortalSignDrawer;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.knarcraft.stargate.utility.ColorHelper;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -173,13 +179,105 @@ public final class StargateGateConfig {
|
||||
return (String) configOptions.get(ConfigOption.DEFAULT_GATE_NETWORK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the exit velocity of players using stargates, relative to the entry velocity
|
||||
*
|
||||
* @return <p>The relative exit velocity</p>
|
||||
*/
|
||||
public double getExitVelocity() {
|
||||
return (double) configOptions.get(ConfigOption.EXIT_VELOCITY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all config values related to gates
|
||||
*/
|
||||
private void loadGateConfig() {
|
||||
//Load the sign colors
|
||||
loadSignColor((String) configOptions.get(ConfigOption.MAIN_SIGN_COLOR),
|
||||
(String) configOptions.get(ConfigOption.HIGHLIGHT_SIGN_COLOR));
|
||||
String mainSignColor = (String) configOptions.get(ConfigOption.MAIN_SIGN_COLOR);
|
||||
String highlightSignColor = (String) configOptions.get(ConfigOption.HIGHLIGHT_SIGN_COLOR);
|
||||
loadPerSignColor(mainSignColor, highlightSignColor);
|
||||
loadPerSignColors();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the per-sign colors specified in the config file
|
||||
*/
|
||||
public void loadPerSignColors() {
|
||||
List<?> perSignColors = (List<?>) configOptions.get(ConfigOption.PER_SIGN_COLORS);
|
||||
ChatColor[] defaultColors = new ChatColor[]{PortalSignDrawer.getMainColor(), PortalSignDrawer.getHighlightColor()};
|
||||
List<Map<Material, ChatColor>> colorMaps = new ArrayList<>();
|
||||
colorMaps.add(new HashMap<>());
|
||||
colorMaps.add(new HashMap<>());
|
||||
|
||||
for (Object signColorSpecification : perSignColors) {
|
||||
parsePerSignColors(signColorSpecification, defaultColors, colorMaps);
|
||||
}
|
||||
|
||||
PortalSignDrawer.setPerSignMainColors(colorMaps.get(0));
|
||||
PortalSignDrawer.setPerSignHighlightColors(colorMaps.get(1));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a per-sign color specification object and stores the result
|
||||
*
|
||||
* @param signColorSpecification <p>The sign color specification to parse</p>
|
||||
* @param defaultColors <p>The specified default colors</p>
|
||||
* @param colorMaps <p>The list of color maps to save the resulting colors to</p>
|
||||
*/
|
||||
private void parsePerSignColors(Object signColorSpecification, ChatColor[] defaultColors,
|
||||
List<Map<Material, ChatColor>> colorMaps) {
|
||||
String[] specificationData = String.valueOf(signColorSpecification).split(":");
|
||||
Material[] signMaterials = new Material[]{Material.matchMaterial(specificationData[0] + "_SIGN"),
|
||||
Material.matchMaterial(specificationData[0] + "_WALL_SIGN")};
|
||||
|
||||
if (specificationData.length != 2) {
|
||||
Stargate.logWarning("You have an invalid per-sign line in your config.yml file. Please fix it!");
|
||||
return;
|
||||
}
|
||||
String[] colors = specificationData[1].split(",");
|
||||
if (colors.length != 2) {
|
||||
Stargate.logWarning("You have an invalid per-sign line in your config.yml file. Please fix it!");
|
||||
return;
|
||||
}
|
||||
for (int colorIndex = 0; colorIndex < 2; colorIndex++) {
|
||||
if (colors[colorIndex].equalsIgnoreCase("default")) {
|
||||
continue;
|
||||
}
|
||||
loadPerSignColor(colors, colorIndex, defaultColors, signMaterials, colorMaps);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a per-sign color
|
||||
*
|
||||
* @param colors <p>The colors specified in the config file</p>
|
||||
* @param colorIndex <p>The index of the color to load</p>
|
||||
* @param defaultColors <p>The specified default colors</p>
|
||||
* @param signMaterials <p>The materials to load this color for</p>
|
||||
* @param colorMaps <p>The list of color maps to save the resulting color to</p>
|
||||
*/
|
||||
private void loadPerSignColor(String[] colors, int colorIndex, ChatColor[] defaultColors, Material[] signMaterials,
|
||||
List<Map<Material, ChatColor>> colorMaps) {
|
||||
ChatColor parsedColor;
|
||||
if (colors[colorIndex].equalsIgnoreCase("inverted")) {
|
||||
//Convert from ChatColor to awt.Color to Bukkit.Color then invert and convert to ChatColor
|
||||
java.awt.Color color = defaultColors[colorIndex].getColor();
|
||||
parsedColor = ColorHelper.fromColor(ColorHelper.invert(Color.fromRGB(color.getRed(),
|
||||
color.getGreen(), color.getBlue())));
|
||||
} else {
|
||||
try {
|
||||
parsedColor = ChatColor.of(colors[colorIndex]);
|
||||
} catch (IllegalArgumentException | NullPointerException exception) {
|
||||
Stargate.logWarning("You have specified an invalid per-sign color in your config.yml. Custom color for \"" +
|
||||
signMaterials[0] + "\" disabled");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (parsedColor != null) {
|
||||
for (Material signMaterial : signMaterials) {
|
||||
colorMaps.get(colorIndex).put(signMaterial, parsedColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -187,13 +285,18 @@ public final class StargateGateConfig {
|
||||
*
|
||||
* @param mainSignColor <p>A string representing the main sign color</p>
|
||||
*/
|
||||
private void loadSignColor(String mainSignColor, String highlightSignColor) {
|
||||
private void loadPerSignColor(String mainSignColor, String highlightSignColor) {
|
||||
try {
|
||||
PortalSignDrawer.setMainColor(ChatColor.valueOf(mainSignColor.toUpperCase()));
|
||||
PortalSignDrawer.setHighlightColor(ChatColor.valueOf(highlightSignColor.toUpperCase()));
|
||||
PortalSignDrawer.setMainColor(ChatColor.of(mainSignColor.toUpperCase()));
|
||||
} catch (IllegalArgumentException | NullPointerException exception) {
|
||||
Stargate.logWarning("You have specified an invalid color in your config.yml. Defaulting to BLACK and WHITE");
|
||||
Stargate.logWarning("You have specified an invalid main sign color in your config.yml. Defaulting to BLACK");
|
||||
PortalSignDrawer.setMainColor(ChatColor.BLACK);
|
||||
}
|
||||
|
||||
try {
|
||||
PortalSignDrawer.setHighlightColor(ChatColor.of(highlightSignColor.toUpperCase()));
|
||||
} catch (IllegalArgumentException | NullPointerException exception) {
|
||||
Stargate.logWarning("You have specified an invalid highlighting sign color in your config.yml. Defaulting to WHITE");
|
||||
PortalSignDrawer.setHighlightColor(ChatColor.WHITE);
|
||||
}
|
||||
}
|
||||
|
67
src/main/java/net/knarcraft/stargate/container/SignData.java
Normal file
67
src/main/java/net/knarcraft/stargate/container/SignData.java
Normal file
@ -0,0 +1,67 @@
|
||||
package net.knarcraft.stargate.container;
|
||||
|
||||
import net.knarcraft.stargate.utility.ColorHelper;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.DyeColor;
|
||||
import org.bukkit.block.Sign;
|
||||
|
||||
/**
|
||||
* A class that keeps track of the sign colors for a given sign
|
||||
*/
|
||||
public class SignData {
|
||||
|
||||
private final Sign sign;
|
||||
private final ChatColor mainSignColor;
|
||||
private final ChatColor highlightSignColor;
|
||||
private final DyeColor dyedColor;
|
||||
|
||||
/**
|
||||
* Instantiates a new sign colors object
|
||||
*
|
||||
* @param sign <p>The sign the colors belong to</p>
|
||||
* @param mainSignColor <p>The main color to use for the sign</p>
|
||||
* @param highlightSignColor <p>The highlighting color to use for the sign</p>
|
||||
*/
|
||||
public SignData(Sign sign, ChatColor mainSignColor, ChatColor highlightSignColor) {
|
||||
this.sign = sign;
|
||||
this.mainSignColor = mainSignColor;
|
||||
this.highlightSignColor = highlightSignColor;
|
||||
this.dyedColor = sign.getColor();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the sign of this sign colors object
|
||||
*
|
||||
* @return <p>The sign of this sign colors object</p>
|
||||
*/
|
||||
public Sign getSign() {
|
||||
return sign;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the main color of the sign
|
||||
*
|
||||
* @return <p>The main color of the sign</p>
|
||||
*/
|
||||
public ChatColor getMainSignColor() {
|
||||
if (dyedColor != DyeColor.BLACK) {
|
||||
return ColorHelper.fromColor(dyedColor.getColor());
|
||||
} else {
|
||||
return mainSignColor;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the highlighting color of the sign
|
||||
*
|
||||
* @return <p>The highlighting color of the sign</p>
|
||||
*/
|
||||
public ChatColor getHighlightSignColor() {
|
||||
if (dyedColor != DyeColor.BLACK) {
|
||||
return ColorHelper.fromColor(ColorHelper.invert(dyedColor.getColor()));
|
||||
} else {
|
||||
return highlightSignColor;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -13,7 +13,9 @@ import net.knarcraft.stargate.utility.BungeeHelper;
|
||||
import net.knarcraft.stargate.utility.MaterialHelper;
|
||||
import net.knarcraft.stargate.utility.PermissionHelper;
|
||||
import net.knarcraft.stargate.utility.UUIDMigrationHelper;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.knarcraft.stargate.utility.UpdateChecker;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.data.type.WallSign;
|
||||
@ -32,14 +34,16 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* This listener listens to any player-related events related to stargates
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class PlayerEventListener implements Listener {
|
||||
|
||||
private static long eventTime;
|
||||
private static PlayerInteractEvent previousEvent;
|
||||
private static final Map<Player, Long> previousEventTimes = new HashMap<>();
|
||||
|
||||
/**
|
||||
* This event handler handles detection of any player teleporting through a bungee gate
|
||||
@ -48,14 +52,22 @@ public class PlayerEventListener implements Listener {
|
||||
*/
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
//Migrate player name to UUID if necessary
|
||||
UUIDMigrationHelper.migrateUUID(event.getPlayer());
|
||||
UUIDMigrationHelper.migrateUUID(player);
|
||||
|
||||
//Notify joining admins about the available update
|
||||
String availableUpdate = Stargate.getUpdateAvailable();
|
||||
if (availableUpdate != null && Stargate.getStargateConfig().alertAdminsAboutUpdates() &&
|
||||
player.hasPermission("stargate.admin")) {
|
||||
String updateMessage = UpdateChecker.getUpdateAvailableString(availableUpdate, Stargate.getPluginVersion());
|
||||
Stargate.getMessageSender().sendErrorMessage(player, updateMessage);
|
||||
}
|
||||
|
||||
if (!Stargate.getGateConfig().enableBungee()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
//Check if the player is waiting to be teleported to a stargate
|
||||
String destination = BungeeHelper.removeFromQueue(player.getUniqueId());
|
||||
if (destination == null) {
|
||||
@ -212,6 +224,18 @@ public class PlayerEventListener implements Listener {
|
||||
return;
|
||||
}
|
||||
|
||||
//Allow players with permissions to apply dye to signs
|
||||
EquipmentSlot hand = event.getHand();
|
||||
if (hand != null && (PermissionHelper.hasPermission(player, "stargate.admin.dye") ||
|
||||
portal.isOwner(player))) {
|
||||
String itemName = player.getInventory().getItem(hand).getType().toString();
|
||||
if (itemName.endsWith("DYE") || itemName.endsWith("INK_SAC")) {
|
||||
event.setUseInteractedBlock(Event.Result.ALLOW);
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), portal::drawSign, 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
event.setUseInteractedBlock(Event.Result.DENY);
|
||||
if (leftClick) {
|
||||
//Cancel event in creative mode to prevent breaking the sign
|
||||
@ -273,7 +297,7 @@ public class PlayerEventListener implements Listener {
|
||||
}
|
||||
|
||||
//Prevent a double click caused by a Spigot bug
|
||||
if (clickIsBug(event, block)) {
|
||||
if (clickIsBug(event.getPlayer(), block)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -344,19 +368,17 @@ public class PlayerEventListener implements Listener {
|
||||
* immediately, or causing portal information printing twice. This fix should detect the bug without breaking
|
||||
* clicking once the bug is fixed.</p>
|
||||
*
|
||||
* @param event <p>The event causing the right click</p>
|
||||
* @param block <p>The block to check</p>
|
||||
* @param player <p>The player performing the right-click</p>
|
||||
* @param block <p>The block to check</p>
|
||||
* @return <p>True if the click is a bug and should be cancelled</p>
|
||||
*/
|
||||
private boolean clickIsBug(PlayerInteractEvent event, Block block) {
|
||||
if (previousEvent != null &&
|
||||
event.getPlayer() == previousEvent.getPlayer() && eventTime + 15 > System.currentTimeMillis()) {
|
||||
previousEvent = null;
|
||||
eventTime = 0;
|
||||
private boolean clickIsBug(Player player, Block block) {
|
||||
Long previousEventTime = previousEventTimes.get(player);
|
||||
if (previousEventTime != null && previousEventTime + 50 > System.currentTimeMillis()) {
|
||||
previousEventTimes.put(player, null);
|
||||
return true;
|
||||
}
|
||||
previousEvent = event;
|
||||
eventTime = System.currentTimeMillis();
|
||||
previousEventTimes.put(player, System.currentTimeMillis());
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@ import net.knarcraft.stargate.portal.property.PortalOptions;
|
||||
import net.knarcraft.stargate.portal.property.PortalOwner;
|
||||
import net.knarcraft.stargate.portal.property.PortalStructure;
|
||||
import net.knarcraft.stargate.portal.property.gate.Gate;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
@ -1,13 +1,19 @@
|
||||
package net.knarcraft.stargate.portal;
|
||||
|
||||
import net.knarcraft.stargate.Stargate;
|
||||
import net.knarcraft.stargate.container.SignData;
|
||||
import net.knarcraft.stargate.portal.property.PortalLocation;
|
||||
import net.knarcraft.stargate.utility.PermissionHelper;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.Sign;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static net.knarcraft.stargate.utility.ColorHelper.translateAllColorCodes;
|
||||
|
||||
/**
|
||||
* The portal sign drawer draws the sing of a given portal
|
||||
*/
|
||||
@ -18,6 +24,8 @@ public class PortalSignDrawer {
|
||||
private static ChatColor freeColor;
|
||||
private static ChatColor mainColor;
|
||||
private static ChatColor highlightColor;
|
||||
private static Map<Material, ChatColor> perSignMainColors;
|
||||
private static Map<Material, ChatColor> perSignHighlightColors;
|
||||
|
||||
/**
|
||||
* Instantiates a new portal sign drawer
|
||||
@ -59,6 +67,42 @@ public class PortalSignDrawer {
|
||||
PortalSignDrawer.freeColor = freeColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the per-sign main colors
|
||||
*
|
||||
* @param signMainColors <p>The per-sign main colors</p>
|
||||
*/
|
||||
public static void setPerSignMainColors(Map<Material, ChatColor> signMainColors) {
|
||||
PortalSignDrawer.perSignMainColors = signMainColors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the per-sign highlight colors
|
||||
*
|
||||
* @param signHighlightColors <p>The per-sign highlight colors</p>
|
||||
*/
|
||||
public static void setPerSignHighlightColors(Map<Material, ChatColor> signHighlightColors) {
|
||||
PortalSignDrawer.perSignHighlightColors = signHighlightColors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the currently used main sign color
|
||||
*
|
||||
* @return <p>The currently used main sign color</p>
|
||||
*/
|
||||
public static ChatColor getMainColor() {
|
||||
return mainColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the currently used highlighting sign color
|
||||
*
|
||||
* @return <p>The currently used highlighting sign color</p>
|
||||
*/
|
||||
public static ChatColor getHighlightColor() {
|
||||
return highlightColor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the sign of the portal this sign drawer is responsible for
|
||||
*/
|
||||
@ -68,7 +112,8 @@ public class PortalSignDrawer {
|
||||
return;
|
||||
}
|
||||
|
||||
drawSign(sign);
|
||||
SignData signData = new SignData(sign, getMainColor(sign.getType()), getHighlightColor(sign.getType()));
|
||||
drawSign(signData);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -93,26 +138,30 @@ public class PortalSignDrawer {
|
||||
/**
|
||||
* Draws the sign of the portal this sign drawer is responsible for
|
||||
*
|
||||
* @param sign <p>The sign re-draw</p>
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
*/
|
||||
private void drawSign(Sign sign) {
|
||||
private void drawSign(SignData signData) {
|
||||
Sign sign = signData.getSign();
|
||||
ChatColor highlightColor = signData.getHighlightSignColor();
|
||||
ChatColor mainColor = signData.getMainSignColor();
|
||||
//Clear sign
|
||||
clearSign(sign);
|
||||
setLine(sign, 0, highlightColor + "-" + mainColor + fixColor(portal.getName()) + highlightColor + "-");
|
||||
setLine(signData, 0, highlightColor + "-" + mainColor + translateAllColorCodes(portal.getName()) +
|
||||
highlightColor + "-");
|
||||
|
||||
if (!portal.getPortalActivator().isActive()) {
|
||||
//Default sign text
|
||||
drawInactiveSign(sign);
|
||||
drawInactiveSign(signData);
|
||||
} else {
|
||||
if (portal.getOptions().isBungee()) {
|
||||
//Bungee sign
|
||||
drawBungeeSign(sign);
|
||||
drawBungeeSign(signData);
|
||||
} else if (portal.getOptions().isFixed()) {
|
||||
//Sign pointing at one other portal
|
||||
drawFixedSign(sign);
|
||||
drawFixedSign(signData);
|
||||
} else {
|
||||
//Networking stuff
|
||||
drawNetworkSign(sign);
|
||||
drawNetworkSign(signData);
|
||||
}
|
||||
}
|
||||
|
||||
@ -139,16 +188,16 @@ public class PortalSignDrawer {
|
||||
return;
|
||||
}
|
||||
clearSign(sign);
|
||||
sign.setLine(0, fixColor(portal.getName()));
|
||||
sign.setLine(0, translateAllColorCodes(portal.getName()));
|
||||
sign.update();
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a sign with choose-able network locations
|
||||
*
|
||||
* @param sign <p>The sign to re-draw</p>
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
*/
|
||||
private void drawNetworkSign(Sign sign) {
|
||||
private void drawNetworkSign(SignData signData) {
|
||||
PortalActivator destinations = portal.getPortalActivator();
|
||||
int maxIndex = destinations.getDestinations().size() - 1;
|
||||
int signLineIndex = 0;
|
||||
@ -158,85 +207,91 @@ public class PortalSignDrawer {
|
||||
|
||||
//Last, and not only entry. Draw the entry two back
|
||||
if ((destinationIndex == maxIndex) && (maxIndex > 1)) {
|
||||
drawNetworkSignLine(freeGatesColored, sign, ++signLineIndex, destinationIndex - 2);
|
||||
drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex - 2);
|
||||
}
|
||||
//Not first entry. Draw the previous entry
|
||||
if (destinationIndex > 0) {
|
||||
drawNetworkSignLine(freeGatesColored, sign, ++signLineIndex, destinationIndex - 1);
|
||||
drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex - 1);
|
||||
}
|
||||
//Draw the chosen entry (line 2 or 3)
|
||||
drawNetworkSignChosenLine(freeGatesColored, sign, ++signLineIndex);
|
||||
drawNetworkSignChosenLine(signData, freeGatesColored, ++signLineIndex);
|
||||
//Has another entry and space on the sign
|
||||
if ((maxIndex >= destinationIndex + 1)) {
|
||||
drawNetworkSignLine(freeGatesColored, sign, ++signLineIndex, destinationIndex + 1);
|
||||
drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex + 1);
|
||||
}
|
||||
//Has another entry and space on the sign
|
||||
if ((maxIndex >= destinationIndex + 2) && (++signLineIndex <= 3)) {
|
||||
drawNetworkSignLine(freeGatesColored, sign, signLineIndex, destinationIndex + 2);
|
||||
drawNetworkSignLine(signData, freeGatesColored, signLineIndex, destinationIndex + 2);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the chosen destination on one sign line
|
||||
*
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
* @param freeGatesColored <p>Whether to display free gates in a different color</p>
|
||||
* @param sign <p>The sign to draw on</p>
|
||||
* @param signLineIndex <p>The line to draw on</p>
|
||||
*/
|
||||
private void drawNetworkSignChosenLine(boolean freeGatesColored, Sign sign, int signLineIndex) {
|
||||
private void drawNetworkSignChosenLine(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);
|
||||
ChatColor nameColor = (free ? freeColor : highlightColor);
|
||||
setLine(sign, signLineIndex, nameColor + ">" + (free ? freeColor : mainColor) +
|
||||
fixColor(portal.getDestinationName()) + nameColor + "<");
|
||||
setLine(signData, signLineIndex, nameColor + ">" + (free ? freeColor : mainColor) +
|
||||
translateAllColorCodes(portal.getDestinationName()) + nameColor + "<");
|
||||
} else {
|
||||
setLine(sign, signLineIndex, highlightColor + ">" + mainColor +
|
||||
fixColor(portal.getDestinationName()) + highlightColor + "<");
|
||||
setLine(signData, signLineIndex, highlightColor + ">" + mainColor +
|
||||
translateAllColorCodes(portal.getDestinationName()) + highlightColor + "<");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a line on a sign, adding the chosen sign color
|
||||
*
|
||||
* @param sign <p>The sign to update</p>
|
||||
* @param index <p>The index of the sign line to change</p>
|
||||
* @param text <p>The new text on the sign</p>
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
* @param index <p>The index of the sign line to change</p>
|
||||
* @param text <p>The new text on the sign</p>
|
||||
*/
|
||||
public void setLine(Sign sign, int index, String text) {
|
||||
sign.setLine(index, mainColor + text);
|
||||
public void setLine(SignData signData, int index, String text) {
|
||||
ChatColor mainColor = signData.getMainSignColor();
|
||||
signData.getSign().setLine(index, mainColor + text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws one network destination on one sign line
|
||||
*
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
* @param freeGatesColored <p>Whether to display free gates in a different color</p>
|
||||
* @param sign <p>The sign to draw on</p>
|
||||
* @param signLineIndex <p>The line to draw on</p>
|
||||
* @param destinationIndex <p>The index of the destination to draw</p>
|
||||
*/
|
||||
private void drawNetworkSignLine(boolean freeGatesColored, Sign sign, int signLineIndex, int destinationIndex) {
|
||||
private void drawNetworkSignLine(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);
|
||||
setLine(sign, signLineIndex, (free ? freeColor : mainColor) + fixColor(destinationName));
|
||||
setLine(signData, signLineIndex, (free ? freeColor : mainColor) + translateAllColorCodes(destinationName));
|
||||
} else {
|
||||
setLine(sign, signLineIndex, mainColor + fixColor(destinationName));
|
||||
setLine(signData, signLineIndex, mainColor + translateAllColorCodes(destinationName));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the sign of a BungeeCord portal
|
||||
*
|
||||
* @param sign <p>The sign to re-draw</p>
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
*/
|
||||
private void drawBungeeSign(Sign sign) {
|
||||
setLine(sign, 1, Stargate.getString("bungeeSign"));
|
||||
setLine(sign, 2, highlightColor + ">" + mainColor + fixColor(portal.getDestinationName()) +
|
||||
private void drawBungeeSign(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(sign, 3, highlightColor + "[" + mainColor + fixColor(portal.getNetwork()) +
|
||||
setLine(signData, 3, highlightColor + "[" + mainColor + translateAllColorCodes(portal.getNetwork()) +
|
||||
highlightColor + "]");
|
||||
}
|
||||
|
||||
@ -245,43 +300,48 @@ public class PortalSignDrawer {
|
||||
*
|
||||
* <p>The sign for an in-active portal should display the right-click prompt and the network.</p>
|
||||
*
|
||||
* @param sign <p>The sign to re-draw</p>
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
*/
|
||||
private void drawInactiveSign(Sign sign) {
|
||||
setLine(sign, 1, Stargate.getString("signRightClick"));
|
||||
setLine(sign, 2, Stargate.getString("signToUse"));
|
||||
private void drawInactiveSign(SignData signData) {
|
||||
ChatColor highlightColor = signData.getHighlightSignColor();
|
||||
ChatColor mainColor = signData.getMainSignColor();
|
||||
setLine(signData, 1, Stargate.getString("signRightClick"));
|
||||
setLine(signData, 2, Stargate.getString("signToUse"));
|
||||
if (!portal.getOptions().isNoNetwork()) {
|
||||
setLine(sign, 3, highlightColor + "(" + mainColor + fixColor(portal.getNetwork()) +
|
||||
setLine(signData, 3, highlightColor + "(" + mainColor + translateAllColorCodes(portal.getNetwork()) +
|
||||
highlightColor + ")");
|
||||
} else {
|
||||
setLine(sign, 3, "");
|
||||
setLine(signData, 3, "");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a sign pointing to a fixed location
|
||||
*
|
||||
* @param sign <p>The sign to re-draw</p>
|
||||
* @param signData <p>All necessary sign information</p>
|
||||
*/
|
||||
private void drawFixedSign(Sign sign) {
|
||||
private void drawFixedSign(SignData signData) {
|
||||
ChatColor highlightColor = signData.getHighlightSignColor();
|
||||
ChatColor mainColor = signData.getMainSignColor();
|
||||
Portal destinationPortal = PortalHandler.getByName(Portal.cleanString(portal.getDestinationName()),
|
||||
portal.getCleanNetwork());
|
||||
String destinationName = portal.getOptions().isRandom() ? Stargate.getString("signRandom") :
|
||||
(destinationPortal != null ? destinationPortal.getName() : portal.getDestinationName());
|
||||
setLine(sign, 1, highlightColor + ">" + mainColor + fixColor(destinationName) + highlightColor + "<");
|
||||
setLine(signData, 1, highlightColor + ">" + mainColor + translateAllColorCodes(destinationName) +
|
||||
highlightColor + "<");
|
||||
|
||||
if (portal.getOptions().isNoNetwork()) {
|
||||
setLine(sign, 2, "");
|
||||
setLine(signData, 2, "");
|
||||
} else {
|
||||
setLine(sign, 2, highlightColor + "(" + mainColor + fixColor(portal.getNetwork()) +
|
||||
highlightColor + ")");
|
||||
setLine(signData, 2, highlightColor + "(" + mainColor +
|
||||
translateAllColorCodes(portal.getNetwork()) + highlightColor + ")");
|
||||
}
|
||||
Portal destination = PortalHandler.getByName(Portal.cleanString(portal.getDestinationName()),
|
||||
portal.getNetwork());
|
||||
if (destination == null && !portal.getOptions().isRandom()) {
|
||||
setLine(sign, 3, errorColor + Stargate.getString("signDisconnected"));
|
||||
setLine(signData, 3, errorColor + Stargate.getString("signDisconnected"));
|
||||
} else {
|
||||
setLine(sign, 3, "");
|
||||
setLine(signData, 3, "");
|
||||
}
|
||||
}
|
||||
|
||||
@ -304,13 +364,33 @@ public class PortalSignDrawer {
|
||||
}
|
||||
|
||||
/**
|
||||
* Fixes coloring of signs as the & character isn't translated on all servers
|
||||
* Gets the main color to use for the given sign type
|
||||
*
|
||||
* @param text <p>The text to fix the coloring of</p>
|
||||
* @return <p>The text with the coloring fixed</p>
|
||||
* @param signType <p>The sign type to get the main color for</p>
|
||||
* @return <p>The main color for the given sign type</p>
|
||||
*/
|
||||
private String fixColor(String text) {
|
||||
return ChatColor.translateAlternateColorCodes('&', text);
|
||||
private ChatColor getMainColor(Material signType) {
|
||||
ChatColor signColor = perSignMainColors.get(signType);
|
||||
if (signColor == null) {
|
||||
return mainColor;
|
||||
} else {
|
||||
return signColor;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the highlight color to use for the given sign type
|
||||
*
|
||||
* @param signType <p>The sign type to get the highlight color for</p>
|
||||
* @return <p>The highlight color for the given sign type</p>
|
||||
*/
|
||||
private ChatColor getHighlightColor(Material signType) {
|
||||
ChatColor signColor = perSignHighlightColors.get(signType);
|
||||
if (signColor == null) {
|
||||
return highlightColor;
|
||||
} else {
|
||||
return signColor;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ public class Gate {
|
||||
Material type = topLeft.getRelativeLocation(entranceVector, yaw).getType();
|
||||
|
||||
//Ignore entrance if it's air or water, and we're creating a new gate
|
||||
if (onCreate && (type == Material.AIR || type == Material.WATER)) {
|
||||
if (onCreate && (type.isAir() || type == Material.WATER)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,12 @@ package net.knarcraft.stargate.portal.teleporter;
|
||||
import net.knarcraft.stargate.Stargate;
|
||||
import net.knarcraft.stargate.event.StargatePlayerPortalEvent;
|
||||
import net.knarcraft.stargate.portal.Portal;
|
||||
import net.knarcraft.stargate.utility.DirectionHelper;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
/**
|
||||
* The portal teleporter takes care of the actual portal teleportation for any players
|
||||
@ -32,6 +35,7 @@ public class PlayerTeleporter extends Teleporter {
|
||||
* @param event <p>The player move event triggering the event</p>
|
||||
*/
|
||||
public void teleport(Portal origin, PlayerMoveEvent event) {
|
||||
double velocity = player.getVelocity().length();
|
||||
Location traveller = player.getLocation();
|
||||
Location exit = getExit(player, traveller);
|
||||
|
||||
@ -56,9 +60,16 @@ public class PlayerTeleporter extends Teleporter {
|
||||
if (event == null) {
|
||||
player.teleport(exit);
|
||||
} else {
|
||||
//The new method to teleport in a move event is set the "to" field.
|
||||
//Set the exit location of the event
|
||||
event.setTo(exit);
|
||||
}
|
||||
|
||||
//Set the velocity of the teleported player after the teleportation is finished
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> {
|
||||
Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw());
|
||||
Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity());
|
||||
player.setVelocity(newVelocity);
|
||||
}, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -59,7 +59,7 @@ public abstract class Teleporter {
|
||||
}
|
||||
float newYaw = (portal.getYaw() + adjust) % 360;
|
||||
Stargate.debug("Portal::adjustRotation", "Setting exit yaw to " + newYaw);
|
||||
exit.setYaw(newYaw);
|
||||
exit.setDirection(DirectionHelper.getDirectionVectorFromYaw(newYaw));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -141,7 +141,7 @@ public abstract class Teleporter {
|
||||
if (entitySize > 1) {
|
||||
double entityOffset;
|
||||
if (portal.getOptions().isAlwaysOn()) {
|
||||
entityOffset = entityBoxSize / 2D;
|
||||
entityOffset = (entityBoxSize / 2D);
|
||||
} else {
|
||||
entityOffset = (entitySize / 2D) - 1;
|
||||
}
|
||||
@ -217,8 +217,8 @@ public abstract class Teleporter {
|
||||
protected void loadChunks() {
|
||||
for (Chunk chunk : getChunksToLoad()) {
|
||||
chunk.addPluginChunkTicket(Stargate.getInstance());
|
||||
//Allow the chunk to unload after 3 seconds
|
||||
Stargate.addChunkUnloadRequest(new ChunkUnloadRequest(chunk, 3000L));
|
||||
//Allow the chunk to unload after 10 seconds
|
||||
Stargate.addChunkUnloadRequest(new ChunkUnloadRequest(chunk, 10000L));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -165,7 +165,7 @@ public class VehicleTeleporter extends EntityTeleporter {
|
||||
private void teleportLivingVehicle(Location exit, List<Entity> passengers, Portal origin) {
|
||||
teleportingVehicle.eject();
|
||||
teleportingVehicle.teleport(exit);
|
||||
handleVehiclePassengers(passengers, teleportingVehicle, 2, origin);
|
||||
handleVehiclePassengers(passengers, teleportingVehicle, 2, origin, exit.getDirection());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -194,19 +194,20 @@ public class VehicleTeleporter extends EntityTeleporter {
|
||||
teleportingVehicle.remove();
|
||||
//Set rotation, add passengers and restore velocity
|
||||
newVehicle.setRotation(exit.getYaw(), exit.getPitch());
|
||||
handleVehiclePassengers(passengers, newVehicle, 1, origin);
|
||||
handleVehiclePassengers(passengers, newVehicle, 1, origin, exit.getDirection());
|
||||
scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> newVehicle.setVelocity(newVelocity), 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ejects, teleports and adds all passengers to the target vehicle
|
||||
*
|
||||
* @param passengers <p>The passengers to handle</p>
|
||||
* @param vehicle <p>The vehicle the passengers should be put into</p>
|
||||
* @param delay <p>The amount of milliseconds to wait before adding the vehicle passengers</p>
|
||||
* @param origin <p>The portal the vehicle teleported from</p>
|
||||
* @param passengers <p>The passengers to handle</p>
|
||||
* @param vehicle <p>The vehicle the passengers should be put into</p>
|
||||
* @param delay <p>The amount of milliseconds to wait before adding the vehicle passengers</p>
|
||||
* @param origin <p>The portal the vehicle teleported from</p>
|
||||
* @param exitRotation <p>The rotation of any passengers exiting the stargate</p>
|
||||
*/
|
||||
private void handleVehiclePassengers(List<Entity> passengers, Vehicle vehicle, long delay, Portal origin) {
|
||||
private void handleVehiclePassengers(List<Entity> passengers, Vehicle vehicle, long delay, Portal origin, Vector exitRotation) {
|
||||
for (Entity passenger : passengers) {
|
||||
passenger.eject();
|
||||
scheduler.scheduleSyncDelayedTask(Stargate.getInstance(), () -> {
|
||||
@ -214,7 +215,7 @@ public class VehicleTeleporter extends EntityTeleporter {
|
||||
//Teleport any creatures leashed by the player in a 15-block range
|
||||
teleportLeashedCreatures(player, origin);
|
||||
}
|
||||
teleportAndAddPassenger(vehicle, passenger);
|
||||
teleportAndAddPassenger(vehicle, passenger, exitRotation);
|
||||
}, delay);
|
||||
}
|
||||
}
|
||||
@ -227,9 +228,10 @@ public class VehicleTeleporter extends EntityTeleporter {
|
||||
*
|
||||
* @param targetVehicle <p>The vehicle to add the passenger to</p>
|
||||
* @param passenger <p>The passenger to teleport and add</p>
|
||||
* @param exitDirection <p>The direction of any passengers exiting the stargate</p>
|
||||
*/
|
||||
private void teleportAndAddPassenger(Vehicle targetVehicle, Entity passenger) {
|
||||
if (!passenger.teleport(targetVehicle.getLocation())) {
|
||||
private void teleportAndAddPassenger(Vehicle targetVehicle, Entity passenger, Vector exitDirection) {
|
||||
if (!passenger.teleport(targetVehicle.getLocation().clone().setDirection(exitDirection))) {
|
||||
Stargate.debug("handleVehiclePassengers", "Failed to teleport passenger");
|
||||
}
|
||||
if (!targetVehicle.addPassenger(passenger)) {
|
||||
|
@ -39,8 +39,7 @@ public class BlockChangeThread implements Runnable {
|
||||
Block block = blockChangeRequest.getBlockLocation().getBlock();
|
||||
block.setType(blockChangeRequest.getMaterial(), false);
|
||||
|
||||
if (blockChangeRequest.getMaterial() == Material.END_GATEWAY &&
|
||||
block.getWorld().getEnvironment() == World.Environment.THE_END) {
|
||||
if (blockChangeRequest.getMaterial() == Material.END_GATEWAY) {
|
||||
//Force a specific location to prevent exit gateway generation
|
||||
fixEndGatewayGate(block);
|
||||
} else if (blockChangeRequest.getAxis() != null) {
|
||||
@ -56,8 +55,11 @@ public class BlockChangeThread implements Runnable {
|
||||
*/
|
||||
private static void fixEndGatewayGate(Block block) {
|
||||
EndGateway gateway = (EndGateway) block.getState();
|
||||
gateway.setExitLocation(block.getLocation());
|
||||
gateway.setExactTeleport(true);
|
||||
gateway.setAge(Long.MIN_VALUE);
|
||||
if (block.getWorld().getEnvironment() == World.Environment.THE_END) {
|
||||
gateway.setExitLocation(block.getLocation());
|
||||
gateway.setExactTeleport(true);
|
||||
}
|
||||
gateway.update(false, false);
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@ import net.knarcraft.stargate.Stargate;
|
||||
import net.knarcraft.stargate.portal.Portal;
|
||||
import net.knarcraft.stargate.portal.PortalHandler;
|
||||
import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter;
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
|
||||
|
@ -0,0 +1,47 @@
|
||||
package net.knarcraft.stargate.utility;
|
||||
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import org.bukkit.Color;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class ColorHelper {
|
||||
|
||||
/**
|
||||
* Inverts the given color
|
||||
*
|
||||
* @param color <p>The color to invert</p>
|
||||
* @return <p>The inverted color</p>
|
||||
*/
|
||||
public static Color invert(Color color) {
|
||||
return color.setRed(255 - color.getRed()).setGreen(255 - color.getGreen()).setBlue(255 - color.getBlue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the chat color corresponding to the given color
|
||||
*
|
||||
* @param color <p>The color to convert into a chat color</p>
|
||||
* @return <p>The resulting chat color</p>
|
||||
*/
|
||||
public static ChatColor fromColor(Color color) {
|
||||
return ChatColor.of(String.format("#%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Translates all found color codes to formatting in a string
|
||||
*
|
||||
* @param message <p>The string to search for color codes</p>
|
||||
* @return <p>The message with color codes translated</p>
|
||||
*/
|
||||
public static String translateAllColorCodes(String message) {
|
||||
message = ChatColor.translateAlternateColorCodes('&', message);
|
||||
Pattern pattern = Pattern.compile("(#[a-fA-F0-9]{6})");
|
||||
Matcher matcher = pattern.matcher(message);
|
||||
while (matcher.find()) {
|
||||
message = message.replace(matcher.group(), "" + ChatColor.of(matcher.group()));
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
}
|
@ -113,16 +113,21 @@ public final class DirectionHelper {
|
||||
* @return <p>A normal vector</p>
|
||||
*/
|
||||
public static Vector getCoordinateVectorFromRelativeVector(double right, double down, double out, double yaw) {
|
||||
Vector distanceVector = DirectionHelper.getDirectionVectorFromYaw(yaw);
|
||||
distanceVector.multiply(out);
|
||||
|
||||
Vector rightVector = DirectionHelper.getDirectionVectorFromYaw(yaw - 90);
|
||||
rightVector.multiply(right);
|
||||
|
||||
Vector depthVector = new Vector(0, -1, 0);
|
||||
depthVector.multiply(down);
|
||||
|
||||
return distanceVector.add(rightVector).add(depthVector);
|
||||
if (yaw == 0) {
|
||||
//South
|
||||
return new Vector(right, -down, out);
|
||||
} else if (yaw == 90) {
|
||||
//West
|
||||
return new Vector(-out, -down, right);
|
||||
} else if (yaw == 180) {
|
||||
//North
|
||||
return new Vector(-right, -down, -out);
|
||||
} else if (yaw == 270) {
|
||||
//East
|
||||
return new Vector(out, -down, -right);
|
||||
} else {
|
||||
throw new IllegalArgumentException(String.format("Invalid yaw %f given", yaw));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,6 @@
|
||||
package net.knarcraft.stargate.utility;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
|
@ -0,0 +1,87 @@
|
||||
package net.knarcraft.stargate.utility;
|
||||
|
||||
import net.knarcraft.stargate.Stargate;
|
||||
import org.bukkit.scheduler.BukkitScheduler;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.logging.Level;
|
||||
|
||||
/**
|
||||
* The update checker is responsible for looking for new updates
|
||||
*/
|
||||
public final class UpdateChecker {
|
||||
|
||||
private final static String APIResourceURL = "https://api.spigotmc.org/legacy/update.php?resource=97784";
|
||||
private final static String updateNotice = "A new update is available: %s (You are still on %s)";
|
||||
|
||||
private UpdateChecker() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if there's a new update available, and alerts the user if necessary
|
||||
*/
|
||||
public static void checkForUpdate() {
|
||||
BukkitScheduler scheduler = Stargate.getInstance().getServer().getScheduler();
|
||||
scheduler.runTaskAsynchronously(Stargate.getInstance(), UpdateChecker::queryAPI);
|
||||
}
|
||||
|
||||
/**
|
||||
* Queries the spigot API to check for a newer version, and informs the user
|
||||
*/
|
||||
private static void queryAPI() {
|
||||
try {
|
||||
InputStream inputStream = new URL(APIResourceURL).openStream();
|
||||
BufferedReader reader = FileHelper.getBufferedReaderFromInputStream(inputStream);
|
||||
//There should only be one line of output
|
||||
String newVersion = reader.readLine();
|
||||
reader.close();
|
||||
|
||||
String oldVersion = Stargate.getPluginVersion();
|
||||
//If there is a newer version, notify the user
|
||||
if (isVersionHigher(oldVersion, newVersion)) {
|
||||
Stargate.getConsoleLogger().log(Level.INFO, Stargate.getBackupString("prefix") +
|
||||
getUpdateAvailableString(newVersion, oldVersion));
|
||||
Stargate.setUpdateAvailable(newVersion);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Stargate.debug("UpdateChecker", "Unable to get newest version.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the string to display to a user to alert about a new update
|
||||
*
|
||||
* @param newVersion <p>The new available plugin version</p>
|
||||
* @param oldVersion <p>The old (current) plugin version</p>
|
||||
* @return <p>The string to display</p>
|
||||
*/
|
||||
public static String getUpdateAvailableString(String newVersion, String oldVersion) {
|
||||
return String.format(updateNotice, newVersion, oldVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides whether one version number is higher than another
|
||||
*
|
||||
* @param oldVersion <p>The old version to check</p>
|
||||
* @param newVersion <p>The new version to check</p>
|
||||
* @return <p>True if the new version is higher than the old one</p>
|
||||
*/
|
||||
public static boolean isVersionHigher(String oldVersion, String newVersion) {
|
||||
String[] oldVersionParts = oldVersion.split("\\.");
|
||||
String[] newVersionParts = newVersion.split("\\.");
|
||||
int versionLength = Math.max(oldVersionParts.length, newVersionParts.length);
|
||||
for (int i = 0; i < versionLength; i++) {
|
||||
int oldVersionNumber = oldVersionParts.length > i ? Integer.parseInt(oldVersionParts[i]) : 0;
|
||||
int newVersionNumber = newVersionParts.length > i ? Integer.parseInt(newVersionParts[i]) : 0;
|
||||
if (newVersionNumber != oldVersionNumber) {
|
||||
return newVersionNumber > oldVersionNumber;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -1,72 +1,86 @@
|
||||
# stargate Configuration File
|
||||
# Main stargate config
|
||||
# I----------I----------I #
|
||||
# portalFolder - The folder for storing portals
|
||||
# gateFolder - The folder for storing gate layouts
|
||||
# defaultGateNetwork - The default gate network
|
||||
# destroyedByExplosion - Whether to destroy gates with explosions (Creeper, TNT, etc.)
|
||||
# maxGatesEachNetwork - The maximum number of gates allowed on a network - 0 for unlimited
|
||||
# language - The language file to load for messages
|
||||
# rememberDestination - Whether to remember the cursor location between uses
|
||||
# handleVehicles - Whether to allow vehicles through gates. This overrides other vehicle settings
|
||||
# handleEmptyVehicles - Whether to allow empty vehicles through gates (chest/hopper/tnt/furnace minecarts included)
|
||||
# handleCreatureTransportation - Whether to allow players to transport creatures by sending vehicles (minecarts, boats) through gates
|
||||
# handleNonPlayerVehicles - Whether to allow vehicles with a passenger which is not a player through gates. handleCreatureTransportation must be enabled
|
||||
# handleLeashedCreatures - Whether to allow creatures lead by a player to teleport with the player
|
||||
# sortNetworkDestinations - Whether to sort network lists alphabetically
|
||||
# protectEntrance - Whether to protect gate entrance material (More resource intensive. Only enable if using destroyable open/closed material)
|
||||
# mainSignColor - The color used for drawing signs (Default: BLACK).
|
||||
# highlightSignColor - The color used for sign markings (Default: WHITE)
|
||||
# verifyPortals - Whether all the non-sign blocks are checked to match the gate layout when a stargate is loaded.
|
||||
# I------------I-------------I #
|
||||
# stargate economy options #
|
||||
# I------------I-------------I #
|
||||
# useEconomy - Whether to use an economy plugin
|
||||
# createCost - The cost to create a gate
|
||||
# destroyCost - The cost to destroy a gate
|
||||
# useCost - The cost to use a gate
|
||||
# toOwner - Whether the charge for using a gate goes to the gate's owner
|
||||
# chargeFreeDestination - Whether a gate whose destination is a free gate is still charged
|
||||
# freeGatesColored - Whether a free gate in the destination list is marked with a color
|
||||
# freeGatesColor - The color to use for marking free gates
|
||||
# I-------I-------I #
|
||||
# Debug options #
|
||||
# I-------I-------I #
|
||||
# debug - Debug -- Only enable if you have issues, massive console output
|
||||
# permissionDebug - This will output any and all Permissions checks to console, used for permissions debugging (Requires debug: true)
|
||||
|
||||
# language - The language file to load for messages
|
||||
language: en
|
||||
# adminUpdateAlert - Whether to alert admins about new plugin updates
|
||||
adminUpdateAlert: true
|
||||
folders:
|
||||
# portalFolder - The folder for storing portals
|
||||
portalFolder: plugins/Stargate/portals/
|
||||
# gateFolder - The folder for storing gate layouts
|
||||
gateFolder: plugins/Stargate/gates/
|
||||
gates:
|
||||
# maxGatesEachNetwork - The maximum number of gates allowed on a network - 0 for unlimited
|
||||
maxGatesEachNetwork: 0
|
||||
# defaultGateNetwork - The default gate network
|
||||
defaultGateNetwork: central
|
||||
# exitVelocity - The velocity to give players exiting stargates, relative to the entry velocity
|
||||
exitVelocity: 0.1
|
||||
cosmetic:
|
||||
# rememberDestination - Whether to remember the cursor location between uses
|
||||
rememberDestination: false
|
||||
# sortNetworkDestinations - Whether to sort network lists alphabetically
|
||||
sortNetworkDestinations: false
|
||||
# mainSignColor - The color used for drawing signs (Default: BLACK).
|
||||
mainSignColor: BLACK
|
||||
# highlightSignColor - The color used for sign markings (Default: WHITE)
|
||||
highlightSignColor: WHITE
|
||||
perSignColors:
|
||||
- 'ACACIA:default,default'
|
||||
- 'BIRCH:default,default'
|
||||
- 'CRIMSON:inverted,inverted'
|
||||
- 'DARK_OAK:inverted,inverted'
|
||||
- 'JUNGLE:default,default'
|
||||
- 'OAK:default,default'
|
||||
- 'SPRUCE:inverted,inverted'
|
||||
- 'WARPED:inverted,inverted'
|
||||
integrity:
|
||||
# destroyedByExplosion - Whether to destroy gates with explosions (Creeper, TNT, etc.)
|
||||
destroyedByExplosion: false
|
||||
# verifyPortals - Whether all the non-sign blocks are checked to match the gate layout when a stargate is loaded.
|
||||
verifyPortals: false
|
||||
# protectEntrance - Whether to protect gate entrance material (More resource intensive. Only enable if using destroyable open/closed material)
|
||||
protectEntrance: false
|
||||
functionality:
|
||||
enableBungee: false
|
||||
# handleVehicles - Whether to allow vehicles through gates. This overrides other vehicle settings
|
||||
handleVehicles: true
|
||||
# handleEmptyVehicles - Whether to allow empty vehicles through gates (chest/hopper/tnt/furnace minecarts included)
|
||||
handleEmptyVehicles: true
|
||||
# handleCreatureTransportation - Whether to allow players to transport creatures by sending vehicles (minecarts, boats) through gates
|
||||
handleCreatureTransportation: true
|
||||
# handleNonPlayerVehicles - Whether to allow vehicles with a passenger which is not a player through gates. handleCreatureTransportation must be enabled
|
||||
handleNonPlayerVehicles: true
|
||||
# handleLeashedCreatures - Whether to allow creatures lead by a player to teleport with the player
|
||||
handleLeashedCreatures: true
|
||||
|
||||
# I------------I-------------I #
|
||||
# stargate economy options #
|
||||
# I------------I-------------I #
|
||||
economy:
|
||||
# useEconomy - Whether to use an economy plugin
|
||||
useEconomy: false
|
||||
# createCost - The cost to create a gate
|
||||
createCost: 0
|
||||
# destroyCost - The cost to destroy a gate
|
||||
destroyCost: 0
|
||||
# useCost - The cost to use a gate
|
||||
useCost: 0
|
||||
# toOwner - Whether the charge for using a gate goes to the gate's owner
|
||||
toOwner: false
|
||||
# chargeFreeDestination - Whether a gate whose destination is a free gate is still charged
|
||||
chargeFreeDestination: true
|
||||
# freeGatesColored - Whether a free gate in the destination list is marked with a color
|
||||
freeGatesColored: false
|
||||
# freeGatesColor - The color to use for marking free gates
|
||||
freeGatesColor: DARK_GREEN
|
||||
|
||||
# I-------I-------I #
|
||||
# Debug options #
|
||||
# I-------I-------I #
|
||||
debugging:
|
||||
# debug - Debug -- Only enable if you have issues, massive console output
|
||||
debug: false
|
||||
# permissionDebug - This will output any and all Permissions checks to console, used for permissions debugging (Requires debug: true)
|
||||
permissionDebug: false
|
@ -1,11 +1,11 @@
|
||||
name: Stargate
|
||||
main: net.knarcraft.stargate.Stargate
|
||||
version: 0.9.2.3
|
||||
version: 0.9.3.2
|
||||
description: Stargate mod for Bukkit Revived
|
||||
author: EpicKnarvik97
|
||||
authors: [ Drakia, PseudoKnight, EpicKnarvik97 ]
|
||||
website: https://git.knarcraft.net/EpicKnarvik97/Stargate
|
||||
api-version: 1.17
|
||||
api-version: 1.18
|
||||
softdepend: [ Vault ]
|
||||
commands:
|
||||
stargate:
|
||||
@ -141,6 +141,9 @@ permissions:
|
||||
stargate.admin.config:
|
||||
description: Allows the player to change config values from the chat
|
||||
default: false
|
||||
stargate.admin.dye:
|
||||
description: Allows this player to change the dye of any stargate's sign
|
||||
default: false
|
||||
stargate.server:
|
||||
description: Allows the creation of a BungeeCord stargate going to any server
|
||||
default: false
|
||||
@ -152,4 +155,5 @@ permissions:
|
||||
stargate.admin.hidden: true
|
||||
stargate.admin.private: true
|
||||
stargate.admin.bungee: true
|
||||
stargate.admin.config: true
|
||||
stargate.admin.config: true
|
||||
stargate.admin.dye: true
|
@ -32,6 +32,7 @@ public class GateLayoutTest {
|
||||
|
||||
@AfterAll
|
||||
public static void tearDown() {
|
||||
MockBukkit.getMock().getPluginManager().disablePlugins();
|
||||
MockBukkit.unmock();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user