Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
37ac3d4877 | |||
70495220eb | |||
10c3914a60 | |||
4699f717ec | |||
29c1a00fcd | |||
51f5420f9e | |||
e1a3d2d560 | |||
a84210d550 | |||
351d1762e7 | |||
2c53b7d2a6 | |||
42e02eb141 |
21
README.md
21
README.md
@ -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,14 @@ 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
|
#### \[Version 0.9.1.2] EpicKnarvik97 fork
|
||||||
|
|
||||||
- Allows a sneaking player to see information about a silent stargate with no sign
|
- Allows a sneaking player to see information about a silent stargate with no sign
|
||||||
|
2
pom.xml
2
pom.xml
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<groupId>net.knarcraft</groupId>
|
<groupId>net.knarcraft</groupId>
|
||||||
<artifactId>Stargate</artifactId>
|
<artifactId>Stargate</artifactId>
|
||||||
<version>0.9.1.2</version>
|
<version>0.9.2.0</version>
|
||||||
|
|
||||||
<licenses>
|
<licenses>
|
||||||
<license>
|
<license>
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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()));
|
||||||
|
@ -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()) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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()) {
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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()) {
|
||||||
|
@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
@ -24,4 +24,5 @@ usecost=economy.useCost
|
|||||||
toowner=economy.toOwner
|
toowner=economy.toOwner
|
||||||
chargefreedestination=economy.chargeFreeDestination
|
chargefreedestination=economy.chargeFreeDestination
|
||||||
freegatesgreen=economy.freeGatesGreen
|
freegatesgreen=economy.freeGatesGreen
|
||||||
CheckUpdates=
|
CheckUpdates=
|
||||||
|
economy.freeGatesGreen=economy.freeGatesColored
|
@ -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
|
@ -1,6 +1,6 @@
|
|||||||
name: Stargate
|
name: Stargate
|
||||||
main: net.knarcraft.stargate.Stargate
|
main: net.knarcraft.stargate.Stargate
|
||||||
version: 0.9.1.2
|
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 ]
|
||||||
|
Reference in New Issue
Block a user