12 Commits

Author SHA1 Message Date
37ac3d4877 Fixes a debug route
Some checks failed
EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
2021-11-15 17:25:03 +01:00
70495220eb Simplifies some function calls
Some checks failed
EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
2021-11-15 17:18:00 +01:00
10c3914a60 Makes the free gate color configurable 2021-11-15 00:35:28 +01:00
4699f717ec Ignores color codes and case when sorting destination names
Some checks failed
EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
2021-11-14 14:35:45 +01:00
29c1a00fcd Makes the max portal name and network character limit more easily changeable 2021-11-13 19:28:17 +01:00
51f5420f9e Removes the replacement of spaces to underscores for the cleanString method
Some checks failed
EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
2021-11-13 17:04:13 +01:00
e1a3d2d560 Makes a fixed sign always use the destination portal's actual name if possible 2021-11-13 17:02:13 +01:00
a84210d550 Fixes a couple of bugs which prevented portals using spaces in the name from being properly connected 2021-11-13 03:44:27 +01:00
351d1762e7 Updates changelog, and updates version to 0.9.2.0
Some checks failed
EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
2021-11-12 15:50:32 +01:00
2c53b7d2a6 Makes portal names and networks case and color-insensitive and increases length limit to 13. #17
Ignores &[0-9a-f] color codes when counting towards the name and network string limits
Makes portal lists store cleaned portal and network names to ignore case and color
Names and networks will now match regardless of case and color
Increases portal name/network limit to 13 characters
2021-11-12 15:33:15 +01:00
42e02eb141 Makes the UUIDMigrationHelper final 2021-11-12 13:46:01 +01:00
ad310ddb9c Allows a sneaking player to see information about a silent stargate (0.9.1.2)
Some checks failed
EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
2021-11-10 22:54:20 +01:00
24 changed files with 260 additions and 100 deletions

View File

@ -119,9 +119,9 @@ section). See the Custom Gate Layout section to learn how to add custom gates.
### Sign Layout: ### Sign Layout:
- Line 1: Gate Name (Max 11 characters) - Line 1: Gate Name (Max 13 characters)
- Line 2: Destination Name \[Optional] (Max 11 characters, used for fixed-gates only) - Line 2: Destination Name \[Optional] (Max 13 characters, used for fixed-gates only)
- Line 3: Network name \[Optional] (Max 11 characters) - Line 3: Network name \[Optional] (Max 13 characters)
- Line 4: Options \[Optional] : - Line 4: Options \[Optional] :
- 'A' for always-on fixed gate - 'A' for always-on fixed gate
- 'H' for hidden networked gate - 'H' for hidden networked gate
@ -136,7 +136,9 @@ section). See the Custom Gate Layout section to learn how to add custom gates.
- 'I' is for a silent gate, which does not output anything to the chat while teleporting. Increases immersion - 'I' is for a silent gate, which does not output anything to the chat while teleporting. Increases immersion
- 'E' is for gate without a sign. Only for fixed stargates - 'E' is for gate without a sign. Only for fixed stargates
The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'. The options are the single letter, not the word. So to make a private hidden gate, your 4th line would be 'PH'. The
&\[0-9a-f] color codes are not counted in the character limit, thus allowing a 13-character name with an additional 2
characters used for the color code.
#### Gate networks: #### Gate networks:
@ -323,7 +325,8 @@ economy:
useCost - The cost to use a stargate useCost - The cost to use a stargate
toOwner - Whether the money from gate-use goes to the owner or nobody toOwner - Whether the money from gate-use goes to the owner or nobody
chargeFreeDestination - Enable to make players pay for teleportation even if the destination is free chargeFreeDestination - Enable to make players pay for teleportation even if the destination is free
freeGatesGreen - Enable to make gates that won't cost the player money show up as green freeGatesColored - Enable to make gates that won't cost the player money show up as green
freeGatesColor - This allows you to specify the color of the markings and name of free stargates
debugging: debugging:
debug - Whether to show massive debug output debug - Whether to show massive debug output
permissionDebug - Whether to show massive permission debug output permissionDebug - Whether to show massive permission debug output
@ -388,6 +391,18 @@ portalInfoServer=Server: %server%
# Changes # Changes
#### \[Version 0.9.2.0] EpicKnarvik97 fork
- Increases max length of names and networks to 13 characters
- Excludes color codes from the counted character length to allow a colored, 13-character name
- Makes portal names and networks case- and color-agnostic to prevent some confusion caused by typos or sloppy
configuration
- Makes the free gate color configurable, and renames freeGatesGreen to freeGatesColored
#### \[Version 0.9.1.2] EpicKnarvik97 fork
- Allows a sneaking player to see information about a silent stargate with no sign
#### \[Version 0.9.1.1] EpicKnarvik97 fork #### \[Version 0.9.1.1] EpicKnarvik97 fork
- Makes sure to translate the `&` character to fix a bug causing portal signs to not be colored on some servers - Makes sure to translate the `&` character to fix a bug causing portal signs to not be colored on some servers

View File

@ -4,7 +4,7 @@
<groupId>net.knarcraft</groupId> <groupId>net.knarcraft</groupId>
<artifactId>Stargate</artifactId> <artifactId>Stargate</artifactId>
<version>0.9.1.1</version> <version>0.9.2.0</version>
<licenses> <licenses>
<license> <license>

View File

@ -139,6 +139,15 @@ public class Stargate extends JavaPlugin {
return logger; return logger;
} }
/**
* Gets the max length of portal names and networks
*
* @return <p>The max portal name/network length</p>
*/
public static int getMaxNameNetworkLength() {
return 13;
}
/** /**
* Sends a debug message * Sends a debug message
* *

View File

@ -86,6 +86,7 @@ public class ConfigTabCompleter implements TabCompleter {
} }
case MAIN_SIGN_COLOR: case MAIN_SIGN_COLOR:
case HIGHLIGHT_SIGN_COLOR: case HIGHLIGHT_SIGN_COLOR:
case FREE_GATES_COLOR:
//Return all colors //Return all colors
return filterMatching(getColors(), typedText); return filterMatching(getColors(), typedText);
} }

View File

@ -9,86 +9,144 @@ public enum ConfigOption {
* The language used for player-interface text * The language used for player-interface text
*/ */
LANGUAGE("language", "The language used for all signs and all messages to players", "en"), LANGUAGE("language", "The language used for all signs and all messages to players", "en"),
/** /**
* The folder for portal files * The folder for portal files
*/ */
PORTAL_FOLDER("folders.portalFolder", "The folder containing the portal databases", "plugins/Stargate/portals/"), PORTAL_FOLDER("folders.portalFolder", "The folder containing the portal databases", "plugins/Stargate/portals/"),
/** /**
* The folder for gate files * The folder for gate files
*/ */
GATE_FOLDER("folders.gateFolder", "The folder containing all gate files", "plugins/Stargate/gates/"), GATE_FOLDER("folders.gateFolder", "The folder containing all gate files", "plugins/Stargate/gates/"),
/** /**
* The max number of portals on a single network * The max number of portals on a single network
*/ */
MAX_GATES_EACH_NETWORK("gates.maxGatesEachNetwork", "The max number of stargates in a single network", 0), MAX_GATES_EACH_NETWORK("gates.maxGatesEachNetwork", "The max number of stargates in a single network", 0),
/** /**
* The network used if not specified * The network used if not specified
*/ */
DEFAULT_GATE_NETWORK("gates.defaultGateNetwork", "The network used when no network is specified", "central"), DEFAULT_GATE_NETWORK("gates.defaultGateNetwork", "The network used when no network is specified", "central"),
/** /**
* Whether to remember the lastly used destination * Whether to remember the lastly used destination
*/ */
REMEMBER_DESTINATION("gates.cosmetic.rememberDestination", "Whether to remember the last destination used", false), REMEMBER_DESTINATION("gates.cosmetic.rememberDestination", "Whether to remember the last destination used", false),
/** /**
* Whether to sort the network destinations * Whether to sort the network destinations
*/ */
SORT_NETWORK_DESTINATIONS("gates.cosmetic.sortNetworkDestinations", "Whether to sort destinations by name", false), SORT_NETWORK_DESTINATIONS("gates.cosmetic.sortNetworkDestinations", "Whether to sort destinations by name", false),
/** /**
* The main color to use for all signs * The main color to use for all signs
*/ */
MAIN_SIGN_COLOR("gates.cosmetic.mainSignColor", "The main text color of all stargate signs", "BLACK"), MAIN_SIGN_COLOR("gates.cosmetic.mainSignColor", "The main text color of all stargate signs", "BLACK"),
/** /**
* The color to use for highlighting sign text * The color to use for highlighting sign text
*/ */
HIGHLIGHT_SIGN_COLOR("gates.cosmetic.highlightSignColor", "The text color used for highlighting stargate signs", "WHITE"), HIGHLIGHT_SIGN_COLOR("gates.cosmetic.highlightSignColor", "The text color used for highlighting stargate signs", "WHITE"),
/** /**
* Whether to destroy portals when any blocks are broken by explosions * Whether to destroy portals when any blocks are broken by explosions
*/ */
DESTROYED_BY_EXPLOSION("gates.integrity.destroyedByExplosion", "Whether stargates should be destroyed by explosions", false), DESTROYED_BY_EXPLOSION("gates.integrity.destroyedByExplosion", "Whether stargates should be destroyed by explosions", false),
/** /**
* Whether to verify each portal's gate layout after each load * Whether to verify each portal's gate layout after each load
*/ */
VERIFY_PORTALS("gates.integrity.verifyPortals", "Whether to verify that portals match their gate layout on load", false), VERIFY_PORTALS("gates.integrity.verifyPortals", "Whether to verify that portals match their gate layout on load", false),
/** /**
* Whether to protect the entrance of portals * Whether to protect the entrance of portals
*/ */
PROTECT_ENTRANCE("gates.integrity.protectEntrance", "Whether to protect stargates' entrances", false), PROTECT_ENTRANCE("gates.integrity.protectEntrance", "Whether to protect stargates' entrances", false),
/** /**
* Whether to enable BungeeCord support * Whether to enable BungeeCord support
*/ */
ENABLE_BUNGEE("gates.functionality.enableBungee", "Whether to enable BungeeCord support", false), ENABLE_BUNGEE("gates.functionality.enableBungee", "Whether to enable BungeeCord support", false),
/** /**
* Whether to enable vehicle teleportation * Whether to enable vehicle teleportation
*/ */
HANDLE_VEHICLES("gates.functionality.handleVehicles", "Whether to enable vehicle teleportation", true), HANDLE_VEHICLES("gates.functionality.handleVehicles", "Whether to enable vehicle teleportation", true),
/** /**
* Whether to enable teleportation of empty vehicles * Whether to enable teleportation of empty vehicles
*/ */
HANDLE_EMPTY_VEHICLES("gates.functionality.handleEmptyVehicles", "Whether to enable teleportation of empty vehicles", true), HANDLE_EMPTY_VEHICLES("gates.functionality.handleEmptyVehicles", "Whether to enable teleportation of empty vehicles", true),
/** /**
* Whether to enable teleportation of creatures using vehicles * Whether to enable teleportation of creatures using vehicles
*/ */
HANDLE_CREATURE_TRANSPORTATION("gates.functionality.handleCreatureTransportation", HANDLE_CREATURE_TRANSPORTATION("gates.functionality.handleCreatureTransportation",
"Whether to enable teleportation of vehicles containing non-player creatures", true), "Whether to enable teleportation of vehicles containing non-player creatures", true),
/** /**
* Whether to allow creatures to teleport alone, bypassing any access restrictions * Whether to allow creatures to teleport alone, bypassing any access restrictions
*/ */
HANDLE_NON_PLAYER_VEHICLES("gates.functionality.handleNonPlayerVehicles", HANDLE_NON_PLAYER_VEHICLES("gates.functionality.handleNonPlayerVehicles",
"Whether to enable teleportation of non-empty vehicles without a player", true), "Whether to enable teleportation of non-empty vehicles without a player", true),
/** /**
* Whether to enable teleportations of creatures on a leash * Whether to enable teleportations of creatures on a leash
*/ */
HANDLE_LEASHED_CREATURES("gates.functionality.handleLeashedCreatures", HANDLE_LEASHED_CREATURES("gates.functionality.handleLeashedCreatures",
"Whether to enable players to teleport a creature on a leash", true), "Whether to enable players to teleport a creature on a leash", true),
/**
* Whether to enable economy support for taking payment from players creating/destroying/using stargates
*/
USE_ECONOMY("economy.useEconomy", "Whether to use economy to incur fees when stargates are used, created or destroyed", false), USE_ECONOMY("economy.useEconomy", "Whether to use economy to incur fees when stargates are used, created or destroyed", false),
/**
* The cost of creating a new stargate
*/
CREATE_COST("economy.createCost", "The cost of creating a new stargate", 0), CREATE_COST("economy.createCost", "The cost of creating a new stargate", 0),
/**
* The cost of destroying a stargate
*/
DESTROY_COST("economy.destroyCost", "The cost of destroying a stargate. Negative to refund", 0), DESTROY_COST("economy.destroyCost", "The cost of destroying a stargate. Negative to refund", 0),
/**
* The cost of using (teleporting through) a stargate
*/
USE_COST("economy.useCost", "The cost of using (teleporting through) a stargate", 0), USE_COST("economy.useCost", "The cost of using (teleporting through) a stargate", 0),
/**
* Whether any payments should go to the stargate's owner
*/
TO_OWNER("economy.toOwner", "Whether any teleportation fees should go to the owner of the used stargate", false), TO_OWNER("economy.toOwner", "Whether any teleportation fees should go to the owner of the used stargate", false),
/**
* Whether to charge for using a stargate, even if its destination is free
*/
CHARGE_FREE_DESTINATION("economy.chargeFreeDestination", CHARGE_FREE_DESTINATION("economy.chargeFreeDestination",
"Whether to require payment if the destination is free, but the entrance stargate is not", true), "Whether to require payment if the destination is free, but the entrance stargate is not", true),
FREE_GATES_GREEN("economy.freeGatesGreen", "Whether to use green coloring to mark all free stargates", false),
/**
* Whether to mark free gates with a different color
*/
FREE_GATES_COLORED("economy.freeGatesColored", "Whether to use coloring to mark all free stargates", false),
/**
* The color to use for marking free stargates
*/
FREE_GATES_COLOR("economy.freeGatesColor", "The color to use for marking free stargates", "DARK_GREEN"),
/**
* Whether to enable debug output
*/
DEBUG("debugging.debug", "Whether to enable debugging output", false), DEBUG("debugging.debug", "Whether to enable debugging output", false),
/**
* 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);

View File

@ -2,10 +2,12 @@ package net.knarcraft.stargate.config;
import net.knarcraft.stargate.Stargate; import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.Portal;
import net.knarcraft.stargate.portal.PortalSignDrawer;
import net.knarcraft.stargate.portal.property.gate.Gate; import net.knarcraft.stargate.portal.property.gate.Gate;
import net.knarcraft.stargate.utility.PermissionHelper; import net.knarcraft.stargate.utility.PermissionHelper;
import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
@ -28,7 +30,7 @@ public final class EconomyConfig {
private int destroyCost = 0; private int destroyCost = 0;
private boolean toOwner = false; private boolean toOwner = false;
private boolean chargeFreeDestination = true; private boolean chargeFreeDestination = true;
private boolean freeGatesGreen = false; private boolean freeGatesColored = false;
/** /**
* Instantiates a new economy config * Instantiates a new economy config
@ -84,12 +86,12 @@ public final class EconomyConfig {
} }
/** /**
* Gets whether free portals should be marked with green coloring * Gets whether free portals should be marked with a different coloring
* *
* @return <p>Whether free portals should be green</p> * @return <p>Whether free portals should be colored</p>
*/ */
public boolean drawFreePortalsGreen() { public boolean drawFreePortalsColored() {
return freeGatesGreen; return freeGatesColored;
} }
/** /**
@ -341,7 +343,14 @@ public final class EconomyConfig {
setDefaultUseCost((Integer) configOptions.get(ConfigOption.USE_COST)); setDefaultUseCost((Integer) configOptions.get(ConfigOption.USE_COST));
toOwner = (boolean) configOptions.get(ConfigOption.TO_OWNER); toOwner = (boolean) configOptions.get(ConfigOption.TO_OWNER);
chargeFreeDestination = (boolean) configOptions.get(ConfigOption.CHARGE_FREE_DESTINATION); chargeFreeDestination = (boolean) configOptions.get(ConfigOption.CHARGE_FREE_DESTINATION);
freeGatesGreen = (boolean) configOptions.get(ConfigOption.FREE_GATES_GREEN); freeGatesColored = (boolean) configOptions.get(ConfigOption.FREE_GATES_COLORED);
try {
String freeColor = (String) configOptions.get(ConfigOption.FREE_GATES_COLOR);
PortalSignDrawer.setFreeColor(ChatColor.valueOf(freeColor.toUpperCase()));
} catch (IllegalArgumentException | NullPointerException ignored) {
PortalSignDrawer.setFreeColor(ChatColor.DARK_GREEN);
}
} }
/** /**

View File

@ -309,9 +309,7 @@ public final class StargateConfig {
FileConfiguration newConfig = Stargate.getInstance().getConfig(); FileConfiguration newConfig = Stargate.getInstance().getConfig();
boolean isMigrating = false; boolean isMigrating = false;
if (newConfig.getString("lang") != null || if (newConfig.getString("lang") != null || newConfig.getString("economy.freeGatesGreen") != null) {
newConfig.getString("gates.integrity.ignoreEntrance") != null ||
newConfig.getString("ignoreEntrance") != null) {
migrateConfig(newConfig); migrateConfig(newConfig);
isMigrating = true; isMigrating = true;
} }

View File

@ -188,7 +188,7 @@ public final class StargateGateConfig {
* @param mainSignColor <p>A string representing the main sign color</p> * @param mainSignColor <p>A string representing the main sign color</p>
*/ */
private void loadSignColor(String mainSignColor, String highlightSignColor) { private void loadSignColor(String mainSignColor, String highlightSignColor) {
if (mainSignColor != null) { if (mainSignColor != null && highlightSignColor != null) {
try { try {
PortalSignDrawer.setColors(ChatColor.valueOf(mainSignColor.toUpperCase()), PortalSignDrawer.setColors(ChatColor.valueOf(mainSignColor.toUpperCase()),
ChatColor.valueOf(highlightSignColor.toUpperCase())); ChatColor.valueOf(highlightSignColor.toUpperCase()));

View File

@ -244,7 +244,7 @@ public class PlayerEventListener implements Listener {
* @return <p>True if the player should be denied</p> * @return <p>True if the player should be denied</p>
*/ */
private boolean cannotAccessPortal(Player player, Portal portal) { private boolean cannotAccessPortal(Player player, Portal portal) {
boolean deny = PermissionHelper.cannotAccessNetwork(player, portal.getNetwork()); boolean deny = PermissionHelper.cannotAccessNetwork(player, portal.getCleanNetwork());
if (PermissionHelper.portalAccessDenied(player, portal, deny)) { if (PermissionHelper.portalAccessDenied(player, portal, deny)) {
if (!portal.getOptions().isSilent()) { if (!portal.getOptions().isSilent()) {
@ -317,7 +317,7 @@ public class PlayerEventListener implements Listener {
} }
//Display portal information as a portal without a sign does not display any //Display portal information as a portal without a sign does not display any
if (portal.getOptions().hasNoSign() && !portal.getOptions().isSilent()) { if (portal.getOptions().hasNoSign() && (!portal.getOptions().isSilent() || player.isSneaking())) {
MessageSender sender = Stargate.getMessageSender(); MessageSender sender = Stargate.getMessageSender();
sender.sendSuccessMessage(player, ChatColor.GOLD + Stargate.getString("portalInfoTitle")); sender.sendSuccessMessage(player, ChatColor.GOLD + Stargate.getString("portalInfoTitle"));
sender.sendSuccessMessage(player, Stargate.replaceVars(Stargate.getString("portalInfoName"), sender.sendSuccessMessage(player, Stargate.replaceVars(Stargate.getString("portalInfoName"),

View File

@ -8,6 +8,7 @@ import net.knarcraft.stargate.portal.property.PortalOptions;
import net.knarcraft.stargate.portal.property.PortalOwner; import net.knarcraft.stargate.portal.property.PortalOwner;
import net.knarcraft.stargate.portal.property.PortalStructure; import net.knarcraft.stargate.portal.property.PortalStructure;
import net.knarcraft.stargate.portal.property.gate.Gate; import net.knarcraft.stargate.portal.property.gate.Gate;
import org.bukkit.ChatColor;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -19,7 +20,10 @@ import java.util.Map;
public class Portal { public class Portal {
private final String name; private final String name;
private final String cleanName;
private final String network; private final String network;
private final String cleanNetwork;
private final PortalOwner portalOwner; private final PortalOwner portalOwner;
private boolean isRegistered; private boolean isRegistered;
@ -53,6 +57,8 @@ public class Portal {
this.portalOpener = new PortalOpener(this, destination); this.portalOpener = new PortalOpener(this, destination);
this.structure = new PortalStructure(this, gate, button); this.structure = new PortalStructure(this, gate, button);
this.portalActivator = portalOpener.getPortalActivator(); this.portalActivator = portalOpener.getPortalActivator();
this.cleanName = cleanString(name);
this.cleanNetwork = cleanString(network);
} }
/** /**
@ -149,6 +155,15 @@ public class Portal {
return network; return network;
} }
/**
* Gets the clean name of the network this portal belongs to
*
* @return <p>The clean network name</p>
*/
public String getCleanNetwork() {
return cleanNetwork;
}
/** /**
* Gets the time this portal was triggered (activated/opened) * Gets the time this portal was triggered (activated/opened)
* *
@ -170,6 +185,15 @@ public class Portal {
return name; return name;
} }
/**
* Gets the clean name of this portal
*
* @return <p>The clean name of this portal</p>
*/
public String getCleanName() {
return cleanName;
}
/** /**
* Gets the portal opener used by this portal * Gets the portal opener used by this portal
* *
@ -273,6 +297,16 @@ public class Portal {
return getTopLeft().getRelativeLocation(vector, getYaw()); return getTopLeft().getRelativeLocation(vector, getYaw());
} }
/**
* Cleans a string by removing color codes, lower-casing and replacing spaces with underscores
*
* @param string <p>The string to clean</p>
* @return <p>The clean string</p>
*/
public static String cleanString(String string) {
return ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', string)).toLowerCase();
}
@Override @Override
public String toString() { public String toString() {
return String.format("Portal [id=%s, network=%s name=%s, type=%s]", getSignLocation(), network, name, return String.format("Portal [id=%s, network=%s name=%s, type=%s]", getSignLocation(), network, name,
@ -283,8 +317,8 @@ public class Portal {
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((cleanName == null) ? 0 : cleanName.hashCode());
result = prime * result + ((network == null) ? 0 : network.hashCode()); result = prime * result + ((cleanNetwork == null) ? 0 : cleanNetwork.hashCode());
return result; return result;
} }
@ -297,18 +331,18 @@ public class Portal {
return false; return false;
} }
Portal other = (Portal) object; Portal other = (Portal) object;
if (name == null) { if (cleanName == null) {
if (other.name != null) { if (other.cleanName != null) {
return false; return false;
} }
} else if (!name.equalsIgnoreCase(other.name)) { } else if (!cleanName.equalsIgnoreCase(other.cleanName)) {
return false; return false;
} }
//If none of the portals have a name, check if the network is the same //If none of the portals have a name, check if the network is the same
if (network == null) { if (cleanNetwork == null) {
return other.network == null; return other.cleanNetwork == null;
} else { } else {
return network.equalsIgnoreCase(other.network); return cleanNetwork.equalsIgnoreCase(other.cleanNetwork);
} }
} }
} }

View File

@ -6,7 +6,7 @@ import net.knarcraft.stargate.event.StargateDeactivateEvent;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
@ -64,7 +64,7 @@ public class PortalActivator {
* @return <p>The destination portal the player should teleport to</p> * @return <p>The destination portal the player should teleport to</p>
*/ */
public Portal getDestination(Player player) { public Portal getDestination(Player player) {
String portalNetwork = portal.getNetwork(); String portalNetwork = portal.getCleanNetwork();
if (portal.getOptions().isRandom()) { if (portal.getOptions().isRandom()) {
//Find possible destinations //Find possible destinations
List<String> destinations = PortalHandler.getDestinations(portal, player, portalNetwork); List<String> destinations = PortalHandler.getDestinations(portal, player, portalNetwork);
@ -73,10 +73,10 @@ public class PortalActivator {
} }
//Get one random destination //Get one random destination
String destination = destinations.get((new Random()).nextInt(destinations.size())); String destination = destinations.get((new Random()).nextInt(destinations.size()));
return PortalHandler.getByName(destination, portalNetwork); return PortalHandler.getByName(Portal.cleanString(destination), portalNetwork);
} else { } else {
//Just return the normal fixed destination //Just return the normal fixed destination
return PortalHandler.getByName(destination, portalNetwork); return PortalHandler.getByName(Portal.cleanString(destination), portalNetwork);
} }
} }
@ -136,12 +136,12 @@ public class PortalActivator {
//Set the given player as the active player //Set the given player as the active player
activePlayer = player; activePlayer = player;
String network = portal.getNetwork(); String network = portal.getCleanNetwork();
destinations = PortalHandler.getDestinations(portal, player, network); destinations = PortalHandler.getDestinations(portal, player, network);
//Sort destinations if enabled //Sort destinations if enabled
if (Stargate.getGateConfig().sortNetworkDestinations()) { if (Stargate.getGateConfig().sortNetworkDestinations()) {
Collections.sort(destinations); destinations.sort(Comparator.comparing(Portal::cleanString));
} }
//Select last used destination if remember destination is enabled //Select last used destination if remember destination is enabled
@ -242,7 +242,7 @@ public class PortalActivator {
activate = true; activate = true;
Stargate.debug("cycleDestination", "Network Size: " + Stargate.debug("cycleDestination", "Network Size: " +
PortalHandler.getNetwork(portal.getNetwork()).size()); PortalHandler.getNetwork(portal.getCleanNetwork()).size());
Stargate.debug("cycleDestination", "Player has access to: " + destinations.size()); Stargate.debug("cycleDestination", "Player has access to: " + destinations.size());
} }

View File

@ -22,6 +22,8 @@ import org.bukkit.event.block.SignChangeEvent;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static net.knarcraft.stargate.Stargate.getMaxNameNetworkLength;
/** /**
* The portal creator can create and validate a new portal * The portal creator can create and validate a new portal
*/ */
@ -105,7 +107,8 @@ public class PortalCreator {
Stargate.debug("createPortal", builder.toString()); Stargate.debug("createPortal", builder.toString());
//Use default network if a proper alternative is not set //Use default network if a proper alternative is not set
if (!portalOptions.get(PortalOption.BUNGEE) && (network.length() < 1 || network.length() > 11)) { if (!portalOptions.get(PortalOption.BUNGEE) && (network.length() < 1 || network.length() >
getMaxNameNetworkLength())) {
network = Stargate.getDefaultNetwork(); network = Stargate.getDefaultNetwork();
} }
@ -117,8 +120,8 @@ public class PortalCreator {
Stargate.debug("createPortal", "Player doesn't have create permissions on network. Trying personal"); Stargate.debug("createPortal", "Player doesn't have create permissions on network. Trying personal");
if (PermissionHelper.canCreatePersonalPortal(player)) { if (PermissionHelper.canCreatePersonalPortal(player)) {
network = player.getName(); network = player.getName();
if (network.length() > 11) { if (network.length() > getMaxNameNetworkLength()) {
network = network.substring(0, 11); network = network.substring(0, getMaxNameNetworkLength());
} }
Stargate.debug("createPortal", "Creating personal portal"); Stargate.debug("createPortal", "Creating personal portal");
Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createPersonal")); Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createPersonal"));
@ -228,29 +231,30 @@ public class PortalCreator {
*/ */
private boolean checkIfNewPortalIsValid(int cost, String portalName) { private boolean checkIfNewPortalIsValid(int cost, String portalName) {
//Check if the portal name can fit on the sign with padding (>name<) //Check if the portal name can fit on the sign with padding (>name<)
if (portal.getName().length() < 1 || portal.getName().length() > 11) { if (portal.getCleanName().length() < 1 || portal.getCleanName().length() > getMaxNameNetworkLength()) {
Stargate.debug("createPortal", "Name length error"); Stargate.debug("createPortal", String.format("Name length error. %s is too long.",
portal.getCleanName()));
Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createNameLength")); Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createNameLength"));
return false; return false;
} }
if (portal.getOptions().isBungee()) { if (portal.getOptions().isBungee()) {
//Check if the bungee portal's name has been duplicated //Check if the bungee portal's name has been duplicated
if (PortalHandler.getBungeePortals().get(portal.getName().toLowerCase()) != null) { if (PortalHandler.getBungeePortals().get(portal.getCleanName()) != null) {
Stargate.debug("createPortal::Bungee", "Gate name duplicate"); Stargate.debug("createPortal::Bungee", "Gate name duplicate");
Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createExists")); Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createExists"));
return false; return false;
} }
} else { } else {
//Check if the portal name has been duplicated on the network //Check if the portal name has been duplicated on the network
if (PortalHandler.getByName(portal.getName(), portal.getNetwork()) != null) { if (PortalHandler.getByName(portal.getCleanName(), portal.getCleanNetwork()) != null) {
Stargate.debug("createPortal", "Gate name duplicate"); Stargate.debug("createPortal", "Gate name duplicate");
Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createExists")); Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createExists"));
return false; return false;
} }
//Check if the number of portals in the network has been surpassed //Check if the number of portals in the network has been surpassed
List<String> networkList = PortalHandler.getAllPortalNetworks().get(portal.getNetwork().toLowerCase()); List<String> networkList = PortalHandler.getAllPortalNetworks().get(portal.getCleanNetwork());
int maxGates = Stargate.getGateConfig().maxGatesEachNetwork(); int maxGates = Stargate.getGateConfig().maxGatesEachNetwork();
if (maxGates > 0 && networkList != null && networkList.size() >= maxGates) { if (maxGates > 0 && networkList != null && networkList.size() >= maxGates) {
Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createFull")); Stargate.getMessageSender().sendErrorMessage(player, Stargate.getString("createFull"));
@ -283,7 +287,7 @@ public class PortalCreator {
portal.getPortalOpener().openPortal(true); portal.getPortalOpener().openPortal(true);
} else if (portal.getOptions().isAlwaysOn()) { } else if (portal.getOptions().isAlwaysOn()) {
//For a normal always-on portal, open both the portal and the destination //For a normal always-on portal, open both the portal and the destination
Portal destinationPortal = PortalHandler.getByName(destinationName, portal.getNetwork()); Portal destinationPortal = PortalHandler.getByName(destinationName, portal.getCleanNetwork());
if (destinationPortal != null) { if (destinationPortal != null) {
portal.getPortalOpener().openPortal(true); portal.getPortalOpener().openPortal(true);
destinationPortal.drawSign(); destinationPortal.drawSign();

View File

@ -66,7 +66,7 @@ public class PortalHandler {
*/ */
public static List<String> getDestinations(Portal entrancePortal, Player player, String network) { public static List<String> getDestinations(Portal entrancePortal, Player player, String network) {
List<String> destinations = new ArrayList<>(); List<String> destinations = new ArrayList<>();
for (String destination : PortalRegistry.getAllPortalNetworks().get(network.toLowerCase())) { for (String destination : PortalRegistry.getAllPortalNetworks().get(network)) {
Portal portal = getByName(destination, network); Portal portal = getByName(destination, network);
if (portal == null) { if (portal == null) {
continue; continue;
@ -80,11 +80,12 @@ public class PortalHandler {
continue; continue;
} }
//Check if destination is this portal //Check if destination is this portal
if (destination.equalsIgnoreCase(entrancePortal.getName())) { if (destination.equals(entrancePortal.getCleanName())) {
continue; continue;
} }
//Check if destination is a fixed portal not pointing to this portal //Check if destination is a fixed portal not pointing to this portal
if (portal.getOptions().isFixed() && !portal.getDestinationName().equalsIgnoreCase(entrancePortal.getName())) { if (portal.getOptions().isFixed() &&
!Portal.cleanString(portal.getDestinationName()).equals(entrancePortal.getCleanName())) {
continue; continue;
} }
//Allow random use by non-players (Minecarts) //Allow random use by non-players (Minecarts)
@ -182,10 +183,10 @@ public class PortalHandler {
* @param portal <p>The newly created portal</p> * @param portal <p>The newly created portal</p>
*/ */
static void updatePortalsPointingAtNewPortal(Portal portal) { static void updatePortalsPointingAtNewPortal(Portal portal) {
for (String originName : PortalRegistry.getAllPortalNetworks().get(portal.getNetwork().toLowerCase())) { for (String originName : PortalRegistry.getAllPortalNetworks().get(portal.getCleanNetwork())) {
Portal origin = getByName(originName, portal.getNetwork()); Portal origin = getByName(originName, portal.getCleanNetwork());
if (origin == null || if (origin == null ||
!origin.getDestinationName().equalsIgnoreCase(portal.getName()) || !Portal.cleanString(origin.getDestinationName()).equals(portal.getCleanName()) ||
!origin.getStructure().isVerified()) { !origin.getStructure().isVerified()) {
continue; continue;
} }

View File

@ -126,7 +126,7 @@ public class PortalOpener {
return; return;
} }
boolean thisIsDestination = destination.getDestinationName().equalsIgnoreCase(portal.getName()); boolean thisIsDestination = Portal.cleanString(destination.getDestinationName()).equals(portal.getCleanName());
//Only open destination if it's not-fixed or points at this portal, and is not already open //Only open destination if it's not-fixed or points at this portal, and is not already open
if (!options.isRandom() && (!destination.getOptions().isFixed() || thisIsDestination) && !destination.isOpen()) { if (!options.isRandom() && (!destination.getOptions().isFixed() || thisIsDestination) && !destination.isOpen()) {
//Open the destination portal //Open the destination portal

View File

@ -63,7 +63,7 @@ public class PortalRegistry {
private static void clearPortals(List<Portal> portalsToRemove) { private static void clearPortals(List<Portal> portalsToRemove) {
//Store the names of the portals to remove as some maps require the name, not the object //Store the names of the portals to remove as some maps require the name, not the object
List<String> portalNames = new ArrayList<>(); List<String> portalNames = new ArrayList<>();
portalsToRemove.forEach((portal) -> portalNames.add(portal.getName())); portalsToRemove.forEach((portal) -> portalNames.add(portal.getCleanName()));
//Clear all the lookup locations for the portals //Clear all the lookup locations for the portals
lookupBlocks.keySet().removeIf((key) -> portalsToRemove.contains(lookupBlocks.get(key))); lookupBlocks.keySet().removeIf((key) -> portalsToRemove.contains(lookupBlocks.get(key)));
@ -165,8 +165,8 @@ public class PortalRegistry {
portal.getPortalActivator().deactivate(); portal.getPortalActivator().deactivate();
portal.getPortalOpener().closePortal(true); portal.getPortalOpener().closePortal(true);
String portalName = portal.getName().toLowerCase(); String portalName = portal.getCleanName();
String networkName = portal.getNetwork().toLowerCase(); String networkName = portal.getCleanNetwork();
//Remove portal from lookup blocks //Remove portal from lookup blocks
for (BlockLocation block : portal.getStructure().getFrame()) { for (BlockLocation block : portal.getStructure().getFrame()) {
@ -203,7 +203,7 @@ public class PortalRegistry {
//Update all portals in the same network with this portal as its destination //Update all portals in the same network with this portal as its destination
for (String originName : allPortalNetworks.get(networkName)) { for (String originName : allPortalNetworks.get(networkName)) {
Portal origin = PortalHandler.getByName(originName, portal.getNetwork()); Portal origin = PortalHandler.getByName(originName, portal.getCleanNetwork());
if (origin == null || !origin.getDestinationName().equalsIgnoreCase(portalName) || if (origin == null || !origin.getDestinationName().equalsIgnoreCase(portalName) ||
!origin.getStructure().isVerified()) { !origin.getStructure().isVerified()) {
continue; continue;
@ -235,8 +235,8 @@ public class PortalRegistry {
portal.getOptions().setFixed(portal.getDestinationName().length() > 0 || portal.getOptions().isRandom() || portal.getOptions().setFixed(portal.getDestinationName().length() > 0 || portal.getOptions().isRandom() ||
portal.getOptions().isBungee()); portal.getOptions().isBungee());
String portalName = portal.getName().toLowerCase(); String portalName = portal.getCleanName();
String networkName = portal.getNetwork().toLowerCase(); String networkName = portal.getCleanNetwork();
//Bungee portals are stored in their own list //Bungee portals are stored in their own list
if (portal.getOptions().isBungee()) { if (portal.getOptions().isBungee()) {

View File

@ -15,7 +15,7 @@ public class PortalSignDrawer {
private final Portal portal; private final Portal portal;
private final static ChatColor errorColor = ChatColor.DARK_RED; private final static ChatColor errorColor = ChatColor.DARK_RED;
private final static ChatColor freeColor = ChatColor.DARK_GREEN; private static ChatColor freeColor;
private static ChatColor mainColor; private static ChatColor mainColor;
private static ChatColor highlightColor; private static ChatColor highlightColor;
@ -29,7 +29,7 @@ public class PortalSignDrawer {
} }
/** /**
* Sets the main sign color * Sets the main and highlighting sign colors
* *
* <p>The main sign color is used for most text on the sign, while the highlighting color is used for the markings * <p>The main sign color is used for most text on the sign, while the highlighting color is used for the markings
* around portal names and network names ('>','<','-',')','(')</p> * around portal names and network names ('>','<','-',')','(')</p>
@ -42,6 +42,15 @@ public class PortalSignDrawer {
highlightColor = newHighlightColor; highlightColor = newHighlightColor;
} }
/**
* Sets the color to use for marking free stargates
*
* @param freeColor <p>The new color to use for marking free stargates</p>
*/
public static void setFreeColor(ChatColor freeColor) {
PortalSignDrawer.freeColor = freeColor;
}
/** /**
* Draws the sign of the portal this sign drawer is responsible for * Draws the sign of the portal this sign drawer is responsible for
*/ */
@ -136,42 +145,42 @@ public class PortalSignDrawer {
int maxIndex = destinations.getDestinations().size() - 1; int maxIndex = destinations.getDestinations().size() - 1;
int signLineIndex = 0; int signLineIndex = 0;
int destinationIndex = destinations.getDestinations().indexOf(portal.getDestinationName()); int destinationIndex = destinations.getDestinations().indexOf(portal.getDestinationName());
boolean freeGatesGreen = Stargate.getEconomyConfig().useEconomy() && boolean freeGatesColored = Stargate.getEconomyConfig().useEconomy() &&
Stargate.getEconomyConfig().drawFreePortalsGreen(); Stargate.getEconomyConfig().drawFreePortalsColored();
//Last, and not only entry. Draw the entry two back //Last, and not only entry. Draw the entry two back
if ((destinationIndex == maxIndex) && (maxIndex > 1)) { if ((destinationIndex == maxIndex) && (maxIndex > 1)) {
drawNetworkSignLine(freeGatesGreen, sign, ++signLineIndex, destinationIndex - 2); drawNetworkSignLine(freeGatesColored, sign, ++signLineIndex, destinationIndex - 2);
} }
//Not first entry. Draw the previous entry //Not first entry. Draw the previous entry
if (destinationIndex > 0) { if (destinationIndex > 0) {
drawNetworkSignLine(freeGatesGreen, sign, ++signLineIndex, destinationIndex - 1); drawNetworkSignLine(freeGatesColored, sign, ++signLineIndex, destinationIndex - 1);
} }
//Draw the chosen entry (line 2 or 3) //Draw the chosen entry (line 2 or 3)
drawNetworkSignChosenLine(freeGatesGreen, sign, ++signLineIndex); drawNetworkSignChosenLine(freeGatesColored, sign, ++signLineIndex);
//Has another entry and space on the sign //Has another entry and space on the sign
if ((maxIndex >= destinationIndex + 1)) { if ((maxIndex >= destinationIndex + 1)) {
drawNetworkSignLine(freeGatesGreen, sign, ++signLineIndex, destinationIndex + 1); drawNetworkSignLine(freeGatesColored, sign, ++signLineIndex, destinationIndex + 1);
} }
//Has another entry and space on the sign //Has another entry and space on the sign
if ((maxIndex >= destinationIndex + 2) && (++signLineIndex <= 3)) { if ((maxIndex >= destinationIndex + 2) && (++signLineIndex <= 3)) {
drawNetworkSignLine(freeGatesGreen, sign, signLineIndex, destinationIndex + 2); drawNetworkSignLine(freeGatesColored, sign, signLineIndex, destinationIndex + 2);
} }
} }
/** /**
* Draws the chosen destination on one sign line * Draws the chosen destination on one sign line
* *
* @param freeGatesGreen <p>Whether to display free gates in a green color</p> * @param freeGatesColored <p>Whether to display free gates in a different color</p>
* @param sign <p>The sign to draw on</p> * @param sign <p>The sign to draw on</p>
* @param signLineIndex <p>The line to draw on</p> * @param signLineIndex <p>The line to draw on</p>
*/ */
private void drawNetworkSignChosenLine(boolean freeGatesGreen, Sign sign, int signLineIndex) { private void drawNetworkSignChosenLine(boolean freeGatesColored, Sign sign, int signLineIndex) {
if (freeGatesGreen) { if (freeGatesColored) {
Portal destination = PortalHandler.getByName(portal.getDestinationName(), portal.getNetwork()); Portal destination = PortalHandler.getByName(portal.getDestinationName(), portal.getNetwork());
boolean green = PermissionHelper.isFree(portal.getActivePlayer(), portal, destination); boolean free = PermissionHelper.isFree(portal.getActivePlayer(), portal, destination);
ChatColor nameColor = (green ? freeColor : highlightColor); ChatColor nameColor = (free ? freeColor : highlightColor);
setLine(sign, signLineIndex, nameColor + ">" + (green ? freeColor : mainColor) + setLine(sign, signLineIndex, nameColor + ">" + (free ? freeColor : mainColor) +
fixColor(portal.getDestinationName()) + nameColor + "<"); fixColor(portal.getDestinationName()) + nameColor + "<");
} else { } else {
setLine(sign, signLineIndex, highlightColor + ">" + mainColor + setLine(sign, signLineIndex, highlightColor + ">" + mainColor +
@ -193,18 +202,18 @@ public class PortalSignDrawer {
/** /**
* Draws one network destination on one sign line * Draws one network destination on one sign line
* *
* @param freeGatesGreen <p>Whether to display free gates in a green color</p> * @param freeGatesColored <p>Whether to display free gates in a different color</p>
* @param sign <p>The sign to draw on</p> * @param sign <p>The sign to draw on</p>
* @param signLineIndex <p>The line to draw on</p> * @param signLineIndex <p>The line to draw on</p>
* @param destinationIndex <p>The index of the destination to draw</p> * @param destinationIndex <p>The index of the destination to draw</p>
*/ */
private void drawNetworkSignLine(boolean freeGatesGreen, Sign sign, int signLineIndex, int destinationIndex) { private void drawNetworkSignLine(boolean freeGatesColored, Sign sign, int signLineIndex, int destinationIndex) {
PortalActivator destinations = portal.getPortalActivator(); PortalActivator destinations = portal.getPortalActivator();
String destinationName = destinations.getDestinations().get(destinationIndex); String destinationName = destinations.getDestinations().get(destinationIndex);
if (freeGatesGreen) { if (freeGatesColored) {
Portal destination = PortalHandler.getByName(destinationName, portal.getNetwork()); Portal destination = PortalHandler.getByName(destinationName, portal.getNetwork());
boolean green = PermissionHelper.isFree(portal.getActivePlayer(), portal, destination); boolean free = PermissionHelper.isFree(portal.getActivePlayer(), portal, destination);
setLine(sign, signLineIndex, (green ? freeColor : mainColor) + fixColor(destinationName)); setLine(sign, signLineIndex, (free ? freeColor : mainColor) + fixColor(destinationName));
} else { } else {
setLine(sign, signLineIndex, mainColor + fixColor(destinationName)); setLine(sign, signLineIndex, mainColor + fixColor(destinationName));
} }
@ -247,8 +256,10 @@ public class PortalSignDrawer {
* @param sign <p>The sign to re-draw</p> * @param sign <p>The sign to re-draw</p>
*/ */
private void drawFixedSign(Sign sign) { private void drawFixedSign(Sign sign) {
Portal destinationPortal = PortalHandler.getByName(Portal.cleanString(portal.getDestinationName()),
portal.getCleanNetwork());
String destinationName = portal.getOptions().isRandom() ? Stargate.getString("signRandom") : String destinationName = portal.getOptions().isRandom() ? Stargate.getString("signRandom") :
portal.getDestinationName(); (destinationPortal != null ? destinationPortal.getName() : portal.getDestinationName());
setLine(sign, 1, highlightColor + ">" + mainColor + fixColor(destinationName) + highlightColor + "<"); setLine(sign, 1, highlightColor + ">" + mainColor + fixColor(destinationName) + highlightColor + "<");
if (portal.getOptions().isNoNetwork()) { if (portal.getOptions().isNoNetwork()) {
@ -257,7 +268,8 @@ public class PortalSignDrawer {
setLine(sign, 2, highlightColor + "(" + mainColor + fixColor(portal.getNetwork()) + setLine(sign, 2, highlightColor + "(" + mainColor + fixColor(portal.getNetwork()) +
highlightColor + ")"); highlightColor + ")");
} }
Portal destination = PortalHandler.getByName(portal.getDestinationName(), portal.getNetwork()); Portal destination = PortalHandler.getByName(Portal.cleanString(portal.getDestinationName()),
portal.getNetwork());
if (destination == null && !portal.getOptions().isRandom()) { if (destination == null && !portal.getOptions().isRandom()) {
setLine(sign, 3, errorColor + Stargate.getString("signDisconnected")); setLine(sign, 3, errorColor + Stargate.getString("signDisconnected"));
} else { } else {

View File

@ -191,9 +191,9 @@ public abstract class Teleporter {
*/ */
private Location adjustExitLocation(Location traveller, Location exitLocation) { private Location adjustExitLocation(Location traveller, Location exitLocation) {
if (exitLocation != null) { if (exitLocation != null) {
BlockData blockData = portal.getWorld().getBlockAt(exitLocation).getBlockData(); BlockData blockData = exitLocation.getBlock().getBlockData();
if ((blockData instanceof Bisected && ((Bisected) blockData).getHalf() == Bisected.Half.BOTTOM) || if ((blockData instanceof Bisected bisected && bisected.getHalf() == Bisected.Half.BOTTOM) ||
(blockData instanceof Slab) && ((Slab) blockData).getType() == Slab.Type.BOTTOM) { (blockData instanceof Slab slab && slab.getType() == Slab.Type.BOTTOM)) {
//Prevent traveller from spawning inside a slab //Prevent traveller from spawning inside a slab
Stargate.debug("adjustExitLocation", "Added a block to get above a slab"); Stargate.debug("adjustExitLocation", "Added a block to get above a slab");
exitLocation.add(0, 1, 0); exitLocation.add(0, 1, 0);

View File

@ -4,6 +4,7 @@ import net.knarcraft.stargate.Stargate;
import net.knarcraft.stargate.portal.Portal; import net.knarcraft.stargate.portal.Portal;
import net.knarcraft.stargate.portal.PortalHandler; import net.knarcraft.stargate.portal.PortalHandler;
import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter; import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
@ -71,7 +72,7 @@ public final class BungeeHelper {
//Build the message data and send it over the SGBungee BungeeCord channel //Build the message data and send it over the SGBungee BungeeCord channel
dataOutputStream.writeUTF("Forward"); dataOutputStream.writeUTF("Forward");
//Send the message to the server defined in the entrance portal's network line //Send the message to the server defined in the entrance portal's network line
dataOutputStream.writeUTF(entrancePortal.getNetwork()); dataOutputStream.writeUTF(stripColor(entrancePortal.getNetwork()));
//Specify the sub-channel/tag to make it recognizable on arrival //Specify the sub-channel/tag to make it recognizable on arrival
dataOutputStream.writeUTF(bungeeSubChannel); dataOutputStream.writeUTF(bungeeSubChannel);
//Write the length of the message //Write the length of the message
@ -102,7 +103,7 @@ public final class BungeeHelper {
//Send a connect-message to connect the player to the server defined in the entrance portal's network line //Send a connect-message to connect the player to the server defined in the entrance portal's network line
dataOutputStream.writeUTF("Connect"); dataOutputStream.writeUTF("Connect");
dataOutputStream.writeUTF(entrancePortal.getNetwork()); dataOutputStream.writeUTF(stripColor(entrancePortal.getNetwork()));
//Send the plugin message //Send the plugin message
player.sendPluginMessage(Stargate.getInstance(), bungeeChannel, byteArrayOutputStream.toByteArray()); player.sendPluginMessage(Stargate.getInstance(), bungeeChannel, byteArrayOutputStream.toByteArray());
@ -207,4 +208,14 @@ public final class BungeeHelper {
return true; return true;
} }
/**
* Strips all color tags from a string
*
* @param string <p>The string to strip color from</p>
* @return <p>The string without color codes</p>
*/
private static String stripColor(String string) {
return ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', string));
}
} }

View File

@ -8,6 +8,8 @@ import net.knarcraft.stargate.portal.teleporter.PlayerTeleporter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import static net.knarcraft.stargate.Stargate.getMaxNameNetworkLength;
/** /**
* Helper class for deciding which actions a player is allowed to perform * Helper class for deciding which actions a player is allowed to perform
*/ */
@ -105,12 +107,12 @@ public final class PermissionHelper {
boolean deny = false; boolean deny = false;
if (entrancePortal.getOptions().isBungee()) { if (entrancePortal.getOptions().isBungee()) {
if (!PermissionHelper.canAccessServer(player, entrancePortal.getNetwork())) { if (!PermissionHelper.canAccessServer(player, entrancePortal.getCleanNetwork())) {
//If the portal is a bungee portal, and the player cannot access the server, deny //If the portal is a bungee portal, and the player cannot access the server, deny
Stargate.debug("cannotAccessPortal", "Cannot access server"); Stargate.debug("cannotAccessPortal", "Cannot access server");
deny = true; deny = true;
} }
} else if (PermissionHelper.cannotAccessNetwork(player, entrancePortal.getNetwork())) { } else if (PermissionHelper.cannotAccessNetwork(player, entrancePortal.getCleanNetwork())) {
//If the player does not have access to the network, deny //If the player does not have access to the network, deny
Stargate.debug("cannotAccessPortal", "Cannot access network"); Stargate.debug("cannotAccessPortal", "Cannot access network");
deny = true; deny = true;
@ -200,8 +202,8 @@ public final class PermissionHelper {
} }
//Is able to create personal gates (Assumption is made they can also access them) //Is able to create personal gates (Assumption is made they can also access them)
String playerName = player.getName(); String playerName = player.getName();
if (playerName.length() > 11) { if (playerName.length() > getMaxNameNetworkLength()) {
playerName = playerName.substring(0, 11); playerName = playerName.substring(0, getMaxNameNetworkLength());
} }
return !network.equals(playerName) || !hasPermission(player, "stargate.create.personal"); return !network.equals(playerName) || !hasPermission(player, "stargate.create.personal");
} }
@ -345,7 +347,7 @@ public final class PermissionHelper {
* @return <p>True if the player is allowed to destroy the portal</p> * @return <p>True if the player is allowed to destroy the portal</p>
*/ */
public static boolean canDestroyPortal(Player player, Portal portal) { public static boolean canDestroyPortal(Player player, Portal portal) {
String network = portal.getNetwork(); String network = portal.getCleanNetwork();
//Use a special check for bungee portals //Use a special check for bungee portals
if (portal.getOptions().isBungee()) { if (portal.getOptions().isBungee()) {

View File

@ -292,16 +292,15 @@ public final class PortalFileHelper {
*/ */
private static void updatePortalButton(Portal portal) { private static void updatePortalButton(Portal portal) {
BlockLocation buttonLocation = getButtonLocation(portal); BlockLocation buttonLocation = getButtonLocation(portal);
BlockData buttonData = buttonLocation.getBlock().getBlockData();
if (portal.getOptions().isAlwaysOn()) { if (portal.getOptions().isAlwaysOn()) {
//Clear button if not already air or water //Clear button if not already air or water
if (MaterialHelper.isButtonCompatible(buttonData.getMaterial())) { if (MaterialHelper.isButtonCompatible(buttonLocation.getType())) {
Material newMaterial = decideRemovalMaterial(buttonLocation, portal); Material newMaterial = decideRemovalMaterial(buttonLocation, portal);
Stargate.addBlockChangeRequest(new BlockChangeRequest(buttonLocation, newMaterial, null)); Stargate.addBlockChangeRequest(new BlockChangeRequest(buttonLocation, newMaterial, null));
} }
} else { } else {
//Replace button if the material does not match //Replace button if the material does not match
if (buttonData.getMaterial() != portal.getGate().getPortalButton()) { if (buttonLocation.getType() != portal.getGate().getPortalButton()) {
generatePortalButton(portal, DirectionHelper.getBlockFaceFromYaw(portal.getYaw())); generatePortalButton(portal, DirectionHelper.getBlockFaceFromYaw(portal.getYaw()));
} }
} }

View File

@ -19,7 +19,11 @@ import java.util.UUID;
/** /**
* Helps migrate player names to UUID where necessary * Helps migrate player names to UUID where necessary
*/ */
public class UUIDMigrationHelper { public final class UUIDMigrationHelper {
private UUIDMigrationHelper() {
}
private static Map<String, List<Portal>> playerNamesToMigrate; private static Map<String, List<Portal>> playerNamesToMigrate;
@ -40,7 +44,7 @@ public class UUIDMigrationHelper {
return; return;
} }
Stargate.debug("PlayerEventListener::migrateUUID", String.format("Migrating name to UUID for player %s", Stargate.debug("UUIDMigrationHelper::migrateUUID", String.format("Migrating name to UUID for player %s",
playerName)); playerName));
List<Portal> portalsOwned = playersToMigrate.get(playerName); List<Portal> portalsOwned = playersToMigrate.get(playerName);
if (portalsOwned == null) { if (portalsOwned == null) {
@ -64,7 +68,7 @@ public class UUIDMigrationHelper {
//Get the real portal from the copy and set UUID //Get the real portal from the copy and set UUID
for (Portal portalCopy : portals) { for (Portal portalCopy : portals) {
Portal portal = PortalHandler.getByName(portalCopy.getName(), portalCopy.getNetwork()); Portal portal = PortalHandler.getByName(portalCopy.getCleanName(), portalCopy.getCleanNetwork());
if (portal != null) { if (portal != null) {
portal.getOwner().setUUID(uniqueId); portal.getOwner().setUUID(uniqueId);
worldsToSave.add(portal.getWorld()); worldsToSave.add(portal.getWorld());

View File

@ -25,3 +25,4 @@ toowner=economy.toOwner
chargefreedestination=economy.chargeFreeDestination chargefreedestination=economy.chargeFreeDestination
freegatesgreen=economy.freeGatesGreen freegatesgreen=economy.freeGatesGreen
CheckUpdates= CheckUpdates=
economy.freeGatesGreen=economy.freeGatesColored

View File

@ -27,7 +27,8 @@
# useCost - The cost to use a gate # useCost - The cost to use a gate
# toOwner - Whether the charge for using a gate goes to the gate's owner # 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 # chargeFreeDestination - Whether a gate whose destination is a free gate is still charged
# freeGatesGreen - Whether a free gate in the destination list is drawn green # 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 # # I-------I-------I #
# Debug options # # Debug options #
# I-------I-------I # # I-------I-------I #
@ -64,7 +65,8 @@ economy:
useCost: 0 useCost: 0
toOwner: false toOwner: false
chargeFreeDestination: true chargeFreeDestination: true
freeGatesGreen: false freeGatesColored: false
freeGatesColor: DARK_GREEN
debugging: debugging:
debug: false debug: false
permissionDebug: false permissionDebug: false

View File

@ -1,6 +1,6 @@
name: Stargate name: Stargate
main: net.knarcraft.stargate.Stargate main: net.knarcraft.stargate.Stargate
version: 0.9.1.1 version: 0.9.2.0
description: Stargate mod for Bukkit Revived description: Stargate mod for Bukkit Revived
author: EpicKnarvik97 author: EpicKnarvik97
authors: [ Drakia, PseudoKnight, EpicKnarvik97 ] authors: [ Drakia, PseudoKnight, EpicKnarvik97 ]