diff --git a/.gitignore b/.gitignore index 41965b4..de21309 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ *.class .* -/target/ +/build/ # Package Files # *.jar @@ -8,3 +8,5 @@ *.ear *.iml +*.iws +*.ipr \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..fd8315f --- /dev/null +++ b/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'java' +apply plugin: 'maven' +apply plugin: 'idea' +apply plugin: 'eclipse' + +group = 'com.sekwah.advancedportals' +version = '1.0.0' + +description = "" + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + + +repositories { + maven { url "http://repo.maven.apache.org/maven2" } +} +dependencies { + compile group: 'com.google.code.gson', name: 'gson', version:'2.8.2' + compile group: 'com.google.inject', name: 'guice', version:'4.0' +} diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f628c45..0000000 --- a/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - 4.0.0 - com.sekwah.advancedportals - Advanced-Portals-Spigot - - ${basedir}/src/ - - - ${basedir}/Resources - - - - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - 1.0.0-snapshot - - UTF-8 - 1.7 - 1.7 - - - - - com.google.code.gson - gson - 2.8.2 - - - org.bukkit - bukkit - 1.12.1-R0.1-SNAPSHOT - provided - - - \ No newline at end of file diff --git a/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java b/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java deleted file mode 100644 index fd71091..0000000 --- a/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java +++ /dev/null @@ -1,252 +0,0 @@ -package com.sekwah.advancedportals.core.api.managers; - -import com.google.gson.reflect.TypeToken; -import com.sekwah.advancedportals.core.AdvancedPortalsCore; -import com.sekwah.advancedportals.core.api.portal.AdvancedPortal; -import com.sekwah.advancedportals.core.api.portal.DataTag; -import com.sekwah.advancedportals.core.api.portal.PortalException; -import com.sekwah.advancedportals.core.api.warphandler.TagHandler; -import com.sekwah.advancedportals.core.data.PlayerLocation; -import com.sekwah.advancedportals.core.data.PortalLocation; -import com.sekwah.advancedportals.core.util.Lang; -import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; - -import java.lang.reflect.Type; -import java.util.*; - -/** - * When a player leaves the server any data stored on them is removed to free memory. - * - * @author sekwah41 - */ -public class PortalManager { - - private final AdvancedPortalsCore portalsCore; - - /** - * Store data of when the player last entered the portal - */ - private HashMap lastAttempt = new HashMap(); - - /** - * Tracks the name of portal a player has selected - */ - private HashMap selectedPortal = new HashMap(); - - private HashMap portalSelectorLeftClick = new HashMap(); - private HashMap portalSelectorRightClick = new HashMap(); - - /** - * Contains all the data for the portals - */ - private HashMap portalHashMap; - - private AdvancedPortal[] portals; - - public PortalManager(AdvancedPortalsCore portalsCore) { - this.portalsCore = portalsCore; - } - - /** - * A player has left the server - * - * @param player - */ - public void playerLeave(PlayerContainer player) { - this.lastAttempt.remove(player.getUUID().toString()); - this.selectedPortal.remove(player.getUUID().toString()); - this.portalSelectorLeftClick.remove(player.getUUID().toString()); - this.portalSelectorRightClick.remove(player.getUUID().toString()); - } - - - /** - * Load the default data into the portals. - */ - public void loadPortals() { - Type type = new TypeToken>() { - }.getType(); - this.portalHashMap = this.portalsCore.getDataStorage().loadJson(type, "portals.json"); - this.savePortals(); - this.updatePortalArray(); - } - - public void savePortals() { - if (this.portalHashMap == null) { - this.portalHashMap = new HashMap<>(); - } - this.portalsCore.getDataStorage().storeJson(this.portalHashMap, "portals.json"); - } - - public void activateCooldown(PlayerContainer player) { - this.lastAttempt.put(player.getUUID().toString(), System.currentTimeMillis()); - } - - public void playerSelectorActivate(PlayerContainer player, PortalLocation blockLoc, boolean leftClick) { - int side = leftClick ? 1 : 2; - if(leftClick) { - this.portalSelectorLeftClick.put(player.getUUID().toString(), blockLoc); - } - else { - this.portalSelectorRightClick.put(player.getUUID().toString(), blockLoc); - } - player.sendMessage(Lang.translateInsertVariablesColor("portal.selector.poschange", side, blockLoc.posX, - blockLoc.posY, blockLoc.posZ)); - } - - public boolean playerMove(PlayerContainer player, PlayerLocation fromLoc, PlayerLocation toLoc) { - return false; - } - - public AdvancedPortal createPortal(String name, PlayerContainer player, ArrayList tags) throws PortalException { - if (this.portalSelectorLeftClick.containsKey(player.getUUID().toString()) - && this.portalSelectorRightClick.containsKey(player.getUUID().toString())) { - return this.createPortal(name, player, this.portalSelectorLeftClick.get(player.getUUID().toString()), - this.portalSelectorRightClick.get(player.getUUID().toString()), tags); - } else { - throw new PortalException("portal.error.invalidselection"); - } - } - - /** - * - * @param loc1 - * @param loc2 - * @param tags - * @return - * @throws PortalException - */ - public void createPortal(String name, PortalLocation loc1, PortalLocation loc2, ArrayList tags) throws PortalException { - createPortal(name, null, loc1, loc2, tags); - } - - - /** - * Maybe add detection for overlapping however thats not a major issue for now and portals may overlap inside - * solid blocks - * - * @param player null if no player - * @param loc1 - * @param loc2 - * @param tags - * @throws PortalException - */ - public AdvancedPortal createPortal(String name, PlayerContainer player, PortalLocation loc1, PortalLocation loc2, ArrayList tags) throws PortalException { - - int maxX = Math.max(loc1.posX, loc2.posX); - int maxY = Math.max(loc1.posY, loc2.posY); - int maxZ = Math.max(loc1.posZ, loc2.posZ); - int minX = Math.min(loc1.posX, loc2.posX); - int minY = Math.min(loc1.posY, loc2.posY); - int minZ = Math.min(loc1.posZ, loc2.posZ); - - if(!loc1.worldName.equalsIgnoreCase(loc2.worldName)) { - throw new PortalException("portal.error.selection.differentworlds"); - } - - PortalLocation maxLoc = new PortalLocation(loc1.worldName, maxX, maxY, maxZ); - PortalLocation minLoc = new PortalLocation(loc1.worldName, minX, minY, minZ); - - if(name == null || name.equals("")) { - throw new PortalException("portal.error.noname"); - } - else if(this.portalHashMap.containsKey(name)) { - throw new PortalException("portal.error.takenname"); - } - - AdvancedPortal portal = new AdvancedPortal(maxLoc, minLoc); - for(DataTag portalTag : tags) { - if(portalTag.NAME.equalsIgnoreCase("triggerblock")) { - ArrayList triggers = new ArrayList<>(); - for(String trigger : portalTag.VALUE.split(",")) { - if(AdvancedPortalsCore.getDataCollector().materialExists(trigger)) { - triggers.add(trigger.toLowerCase()); - } - } - if(triggers.size() != 0) { - portal.setTriggerBlocks(triggers.toArray(new String[0])); - } - } - else { - portal.setArg(portalTag); - } - } - for(DataTag portalTag : tags) { - TagHandler.Creation creation = AdvancedPortalsCore.getPortalTagRegistry().getCreationHandler(portalTag.NAME); - if(creation != null) { - creation.created(portal, player, portalTag.VALUE); - } - } - this.portalHashMap.put(name, portal); - this.updatePortalArray(); - AdvancedPortalsCore.getPortalManager().savePortals(); - return portal; - } - - private void updatePortalArray() { - Collection portalValues = this.portalHashMap.values(); - this.portals = portalValues.toArray(new AdvancedPortal[0]); - } - - public void removePlayerSelection(PlayerContainer player) throws PortalException { - String portal = this.selectedPortal.get(player.getUUID().toString()); - if(portal != null) { - try { - this.removePortal(portal, player); - } - catch(PortalException e) { - if(e.getMessage().equals("command.remove.noname")) { - this.selectedPortal.remove(player.getUUID().toString()); - throw new PortalException("command.remove.invalidselection"); - } - else { - throw e; - } - } - } - throw new PortalException("command.remove.noselection"); - } - - /** - * @param portalName name of portal - * @param player null if a player didnt send it - * @throws PortalException - */ - public void removePortal(String portalName, PlayerContainer player) throws PortalException { - AdvancedPortal portal = this.getPortal(portalName); - if(portal == null) { - throw new PortalException("command.remove.noname"); - } - - for(DataTag portalTag : portal.getArgs()) { - TagHandler.Creation creation = AdvancedPortalsCore.getPortalTagRegistry().getCreationHandler(portalTag.NAME); - if(creation != null) { - creation.destroyed(portal, player, portalTag.VALUE); - } - } - - this.portalHashMap.remove(portalName); - AdvancedPortalsCore.getPortalManager().savePortals(); - } - - private AdvancedPortal getPortal(String portalName) { - return this.portalHashMap.get(portalName); - } - - /** - * Get an array of portals without a reference to the main array - * @return - */ - public Set> getPortals() { - return this.portalHashMap.entrySet(); - } - - public boolean inPortalRegion(PlayerLocation loc) { - return this.inPortalRegion(loc, 0); - } - - private boolean inPortalRegion(PlayerLocation loc, int additionalArea) { - return true; - } - -} \ No newline at end of file diff --git a/src/com/sekwah/advancedportals/core/util/Config.java b/src/com/sekwah/advancedportals/core/util/Config.java deleted file mode 100644 index dc1f41c..0000000 --- a/src/com/sekwah/advancedportals/core/util/Config.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sekwah.advancedportals.core.util; - -/** - * To store the data for config - */ -public class Config { - - private boolean useOnlySpecialAxe = true; - - private String selectorMaterial = "IRON_AXE"; - - private boolean portalProtection = true; - - private int portalProtectionRaduis = 5; - - private String defaultTriggerBlock = "PORTAL"; - - private boolean stopWaterFlow = true; - - private int portalCooldown = 5; - - private String warpParticles = "ENDER"; - - private String warpSound = "ENDER"; - - private String selectionBlock_BELOW_1_13 = "STAINED_GLASS"; - - private String selectionBlock = "RED_STAINED_GLASS"; - - private String translationFile = "en_GB"; - - private int selectionSubID_BELOW_1_13 = 14; - - public boolean getUseOnlySpecialAxe() { - return useOnlySpecialAxe; - } - - public void setUseOnlySpecialAxe(boolean useOnlyServerMadeAxe) { - useOnlySpecialAxe = useOnlyServerMadeAxe; - } - - public String getTranslation() { - return translationFile; - } - - public String getSelectorMaterial() { - return selectorMaterial; - } -} diff --git a/src/com/sekwah/advancedportals/core/AdvancedPortalsCore.java b/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java similarity index 78% rename from src/com/sekwah/advancedportals/core/AdvancedPortalsCore.java rename to src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java index 74693db..4bbc5ca 100644 --- a/src/com/sekwah/advancedportals/core/AdvancedPortalsCore.java +++ b/src/main/java/com/sekwah/advancedportals/core/AdvancedPortalsCore.java @@ -1,17 +1,23 @@ package com.sekwah.advancedportals.core; +import com.google.inject.Guice; +import com.google.inject.Injector; import com.sekwah.advancedportals.core.api.commands.SubCommand; import com.sekwah.advancedportals.core.api.destination.Destination; -import com.sekwah.advancedportals.core.api.managers.DestinationManager; -import com.sekwah.advancedportals.core.api.managers.PortalManager; +import com.sekwah.advancedportals.core.api.services.DestinationServices; +import com.sekwah.advancedportals.core.api.services.PortalServices; +import com.sekwah.advancedportals.core.api.services.PortalTempDataServices; +import com.sekwah.advancedportals.core.config.RepositoryModule; +import com.sekwah.advancedportals.core.repository.ConfigRepository; +import com.sekwah.advancedportals.core.repository.DestinationRepositoryImpl; +import com.sekwah.advancedportals.core.repository.PortalRepositoryImpl; import com.sekwah.advancedportals.core.api.portal.AdvancedPortal; import com.sekwah.advancedportals.core.api.registry.TagRegistry; import com.sekwah.advancedportals.core.api.registry.WarpEffectRegistry; import com.sekwah.advancedportals.core.commands.CommandWithSubCommands; import com.sekwah.advancedportals.core.commands.subcommands.desti.CreateDestiSubCommand; import com.sekwah.advancedportals.core.commands.subcommands.portal.*; -import com.sekwah.advancedportals.core.util.Config; -import com.sekwah.advancedportals.core.util.DataStorage; +import com.sekwah.advancedportals.core.data.DataStorage; import com.sekwah.advancedportals.core.util.InfoLogger; import com.sekwah.advancedportals.core.util.Lang; import com.sekwah.advancedportals.coreconnector.ConnectorDataCollector; @@ -30,15 +36,17 @@ public class AdvancedPortalsCore { private TagRegistry portalTagRegistry; private TagRegistry destiTagRegistry; - private CoreListeners coreListeners; + private Injector injector = Guice.createInjector(new RepositoryModule(this)); - private Config config; + private CoreListeners coreListeners = injector.getInstance(CoreListeners.class); private CommandWithSubCommands portalCommand; private CommandWithSubCommands destiCommand; - private PortalManager portalManager; - private DestinationManager destiManager; + private PortalServices portalServices = injector.getInstance(PortalServices.class); + private DestinationServices destiServices = injector.getInstance(DestinationServices.class); + private PortalTempDataServices portalTempDataServices = injector.getInstance(PortalTempDataServices.class); + private ConfigRepository configRepository = injector.getInstance(ConfigRepository.class); public static final String version = "1.0.0"; public static final String lastTranslationUpdate = "1.0.0"; @@ -53,7 +61,7 @@ public class AdvancedPortalsCore { ConnectorDataCollector dataCollector, int[] mcVer) { this.dataStorage = dataStorage; this.infoLogger = infoLogger; - this.instance = this; + instance = this; this.commandRegister = commandRegister; this.dataCollector = dataCollector; this.mcMinorVer = this.checkMcVer(mcVer); @@ -98,13 +106,10 @@ public class AdvancedPortalsCore { public static String getTranslationName() { - return instance.config.getTranslation(); + return instance.configRepository.getTranslation(); } private void onEnable() { - this.coreListeners = new CoreListeners(this); - this.portalManager = new PortalManager(this); - this.destiManager = new DestinationManager(this); this.warpEffectRegistry = new WarpEffectRegistry(); this.portalTagRegistry = new TagRegistry<>(); this.destiTagRegistry = new TagRegistry<>(); @@ -112,14 +117,14 @@ public class AdvancedPortalsCore { this.dataStorage.copyDefaultFile("lang/en_GB.lang", false); this.loadPortalConfig(); - Lang.loadLanguage(config.getTranslation()); + Lang.loadLanguage(configRepository.getTranslation()); this.registerPortalCommand(); this.registerDestinationCommand(); - this.portalManager.loadPortals(); + this.portalServices.loadPortals(this); - this.destiManager.loadDestinations(); + this.destiServices.loadDestinations(this); this.infoLogger.log(Lang.translate("logger.pluginenable")); } @@ -161,8 +166,8 @@ public class AdvancedPortalsCore { * (basically if values are missing or whatever) */ public void loadPortalConfig() { - this.config = this.dataStorage.loadJson(Config.class, "config.json"); - this.dataStorage.storeJson(this.config, "config.json"); + this.configRepository.loadConfig(this.dataStorage); + this.dataStorage.storeJson(this.configRepository, "config.json"); } /** @@ -176,8 +181,8 @@ public class AdvancedPortalsCore { return instance; } - public Config getConfig() { - return this.config; + public ConfigRepository getConfigRepo() { + return this.configRepository; } public DataStorage getDataStorage() { @@ -196,12 +201,16 @@ public class AdvancedPortalsCore { return instance.coreListeners; } - public static PortalManager getPortalManager() { - return instance.portalManager; + public static PortalServices getPortalServices() { + return instance.portalServices; } - public static DestinationManager getDestinationManager() { - return instance.destiManager; + public static DestinationServices getDestinationServices() { + return instance.destiServices; + } + + public static PortalTempDataServices getPortalTempDataServices() { + return instance.portalTempDataServices; } public static TagRegistry getPortalTagRegistry() { diff --git a/src/com/sekwah/advancedportals/core/CoreListeners.java b/src/main/java/com/sekwah/advancedportals/core/CoreListeners.java similarity index 73% rename from src/com/sekwah/advancedportals/core/CoreListeners.java rename to src/main/java/com/sekwah/advancedportals/core/CoreListeners.java index b07919a..97fe9dd 100644 --- a/src/com/sekwah/advancedportals/core/CoreListeners.java +++ b/src/main/java/com/sekwah/advancedportals/core/CoreListeners.java @@ -1,21 +1,30 @@ package com.sekwah.advancedportals.core; -import com.sekwah.advancedportals.core.data.PlayerLocation; -import com.sekwah.advancedportals.core.data.PortalLocation; +import com.google.inject.name.Named; +import com.sekwah.advancedportals.core.api.services.PortalServices; +import com.sekwah.advancedportals.core.api.services.PortalTempDataServices; +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.core.entities.PortalLocation; +import com.sekwah.advancedportals.core.repository.PortalRepository; +import com.sekwah.advancedportals.core.repository.PortalTempDataRepository; import com.sekwah.advancedportals.core.util.Lang; import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; import com.sekwah.advancedportals.coreconnector.container.WorldContainer; +import javax.inject.Inject; + public class CoreListeners { - private final AdvancedPortalsCore portalsCore; + private PortalTempDataServices portalTempDataServices; - public CoreListeners(AdvancedPortalsCore portalsCore) { - this.portalsCore = portalsCore; - } + private PortalServices portalServices; + + @Inject + @Named("portals-core") + private AdvancedPortalsCore portalsCore; public void playerJoin(PlayerContainer player) { - AdvancedPortalsCore.getPortalManager().activateCooldown(player); + this.portalTempDataServices.activateCooldown(player); if(player.isOp()) { if(!Lang.translate("translatedata.lastchange").equals(AdvancedPortalsCore.lastTranslationUpdate)) { player.sendMessage(Lang.translateColor("messageprefix.negative") @@ -27,11 +36,11 @@ public class CoreListeners { } public void teleportEvent(PlayerContainer player) { - AdvancedPortalsCore.getPortalManager().activateCooldown(player); + this.portalTempDataServices.activateCooldown(player); } public void playerLeave(PlayerContainer player) { - AdvancedPortalsCore.getPortalManager().playerLeave(player); + this.portalTempDataServices.playerLeave(player); } /** @@ -39,7 +48,7 @@ public class CoreListeners { * @return if the entity is allowed to spawn */ public boolean mobSpawn(PlayerLocation loc) { - return !AdvancedPortalsCore.getPortalManager().inPortalRegion(loc); + return !this.portalServices.inPortalRegion(loc); } /** @@ -49,7 +58,7 @@ public class CoreListeners { * @return if the player is allowed to move */ public boolean playerMove(PlayerContainer player, PlayerLocation fromLoc, PlayerLocation toLoc) { - return AdvancedPortalsCore.getPortalManager().playerMove(player, fromLoc, toLoc); + return this.portalServices.playerMove(player, fromLoc, toLoc); } /** @@ -115,13 +124,13 @@ public class CoreListeners { */ public boolean playerInteractWithBlock(PlayerContainer player, String materialName, String itemName, PortalLocation blockLoc, boolean leftClick) { - if((player.isOp() || player.hasPermission("advancedportals.createportal")) && - materialName.equalsIgnoreCase(this.portalsCore.getConfig().getSelectorMaterial()) - && (!this.portalsCore.getConfig().getUseOnlySpecialAxe() || itemName.equals("\u00A7ePortal Region Selector"))) { - AdvancedPortalsCore.getPortalManager().playerSelectorActivate(player, blockLoc, leftClick); + if(itemName != null && (player.isOp() || player.hasPermission("advancedportals.createportal")) && + materialName.equalsIgnoreCase(this.portalsCore.getConfigRepo().getSelectorMaterial()) + && (!this.portalsCore.getConfigRepo().getUseOnlySpecialAxe() || itemName.equals("\u00A7ePortal Region Selector"))) { + this.portalTempDataServices.playerSelectorActivate(player, blockLoc, leftClick); return false; } - else if(leftClick && itemName.equals("\u00A75Portal Block Placer") && player.hasPermission("advancedportals.build")) { + else if(itemName != null && leftClick && itemName.equals("\u00A75Portal Block Placer") && player.hasPermission("advancedportals.build")) { WorldContainer world = player.getWorld(); if(world.getBlockData(blockLoc) == 1) { world.setBlockData(blockLoc, (byte) 2); diff --git a/src/com/sekwah/advancedportals/core/api/commands/SubCommand.java b/src/main/java/com/sekwah/advancedportals/core/api/commands/SubCommand.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/commands/SubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/api/commands/SubCommand.java diff --git a/src/com/sekwah/advancedportals/core/api/destination/Destination.java b/src/main/java/com/sekwah/advancedportals/core/api/destination/Destination.java similarity index 97% rename from src/com/sekwah/advancedportals/core/api/destination/Destination.java rename to src/main/java/com/sekwah/advancedportals/core/api/destination/Destination.java index 3a4b4be..683dda4 100644 --- a/src/com/sekwah/advancedportals/core/api/destination/Destination.java +++ b/src/main/java/com/sekwah/advancedportals/core/api/destination/Destination.java @@ -2,12 +2,12 @@ package com.sekwah.advancedportals.core.api.destination; import com.google.gson.annotations.SerializedName; import com.sekwah.advancedportals.core.AdvancedPortalsCore; -import com.sekwah.advancedportals.core.api.portal.DataTag; +import com.sekwah.advancedportals.core.entities.DataTag; import com.sekwah.advancedportals.core.api.portal.PortalException; import com.sekwah.advancedportals.core.api.registry.TagRegistry; import com.sekwah.advancedportals.core.api.warphandler.ActivationData; import com.sekwah.advancedportals.core.api.warphandler.TagHandler; -import com.sekwah.advancedportals.core.data.PlayerLocation; +import com.sekwah.advancedportals.core.entities.PlayerLocation; import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; import java.util.ArrayList; diff --git a/src/com/sekwah/advancedportals/core/api/effect/TestEffect.java b/src/main/java/com/sekwah/advancedportals/core/api/effect/TestEffect.java similarity index 86% rename from src/com/sekwah/advancedportals/core/api/effect/TestEffect.java rename to src/main/java/com/sekwah/advancedportals/core/api/effect/TestEffect.java index f8ce1d0..a280e68 100644 --- a/src/com/sekwah/advancedportals/core/api/effect/TestEffect.java +++ b/src/main/java/com/sekwah/advancedportals/core/api/effect/TestEffect.java @@ -1,7 +1,7 @@ package com.sekwah.advancedportals.core.api.effect; import com.sekwah.advancedportals.core.api.portal.AdvancedPortal; -import com.sekwah.advancedportals.core.data.PortalLocation; +import com.sekwah.advancedportals.core.entities.PortalLocation; import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; /** diff --git a/src/com/sekwah/advancedportals/core/api/effect/WarpEffect.java b/src/main/java/com/sekwah/advancedportals/core/api/effect/WarpEffect.java similarity index 91% rename from src/com/sekwah/advancedportals/core/api/effect/WarpEffect.java rename to src/main/java/com/sekwah/advancedportals/core/api/effect/WarpEffect.java index 37201a8..d8aa362 100644 --- a/src/com/sekwah/advancedportals/core/api/effect/WarpEffect.java +++ b/src/main/java/com/sekwah/advancedportals/core/api/effect/WarpEffect.java @@ -1,7 +1,7 @@ package com.sekwah.advancedportals.core.api.effect; import com.sekwah.advancedportals.core.api.portal.AdvancedPortal; -import com.sekwah.advancedportals.core.data.PortalLocation; +import com.sekwah.advancedportals.core.entities.PortalLocation; import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; /** diff --git a/src/com/sekwah/advancedportals/core/api/events/PortalEditEvent.java b/src/main/java/com/sekwah/advancedportals/core/api/events/PortalEditEvent.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/events/PortalEditEvent.java rename to src/main/java/com/sekwah/advancedportals/core/api/events/PortalEditEvent.java diff --git a/src/com/sekwah/advancedportals/core/api/events/PortalsLoadedEvent.java b/src/main/java/com/sekwah/advancedportals/core/api/events/PortalsLoadedEvent.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/events/PortalsLoadedEvent.java rename to src/main/java/com/sekwah/advancedportals/core/api/events/PortalsLoadedEvent.java diff --git a/src/com/sekwah/advancedportals/core/api/events/WarpEvent.java b/src/main/java/com/sekwah/advancedportals/core/api/events/WarpEvent.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/events/WarpEvent.java rename to src/main/java/com/sekwah/advancedportals/core/api/events/WarpEvent.java diff --git a/src/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java b/src/main/java/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java similarity index 96% rename from src/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java rename to src/main/java/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java index 6cf441e..219a73e 100644 --- a/src/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java +++ b/src/main/java/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java @@ -5,7 +5,8 @@ import com.sekwah.advancedportals.core.AdvancedPortalsCore; import com.sekwah.advancedportals.core.api.registry.TagRegistry; import com.sekwah.advancedportals.core.api.warphandler.ActivationData; import com.sekwah.advancedportals.core.api.warphandler.TagHandler; -import com.sekwah.advancedportals.core.data.PortalLocation; +import com.sekwah.advancedportals.core.entities.DataTag; +import com.sekwah.advancedportals.core.entities.PortalLocation; import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; import java.util.ArrayList; diff --git a/src/com/sekwah/advancedportals/core/api/portal/PortalException.java b/src/main/java/com/sekwah/advancedportals/core/api/portal/PortalException.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/portal/PortalException.java rename to src/main/java/com/sekwah/advancedportals/core/api/portal/PortalException.java diff --git a/src/com/sekwah/advancedportals/core/api/registry/SubCommandRegistry.java b/src/main/java/com/sekwah/advancedportals/core/api/registry/SubCommandRegistry.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/registry/SubCommandRegistry.java rename to src/main/java/com/sekwah/advancedportals/core/api/registry/SubCommandRegistry.java diff --git a/src/com/sekwah/advancedportals/core/api/registry/TagRegistry.java b/src/main/java/com/sekwah/advancedportals/core/api/registry/TagRegistry.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/registry/TagRegistry.java rename to src/main/java/com/sekwah/advancedportals/core/api/registry/TagRegistry.java diff --git a/src/com/sekwah/advancedportals/core/api/registry/WarpEffectRegistry.java b/src/main/java/com/sekwah/advancedportals/core/api/registry/WarpEffectRegistry.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/registry/WarpEffectRegistry.java rename to src/main/java/com/sekwah/advancedportals/core/api/registry/WarpEffectRegistry.java diff --git a/src/main/java/com/sekwah/advancedportals/core/api/services/DestinationServices.java b/src/main/java/com/sekwah/advancedportals/core/api/services/DestinationServices.java new file mode 100644 index 0000000..35102c7 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/api/services/DestinationServices.java @@ -0,0 +1,33 @@ +package com.sekwah.advancedportals.core.api.services; + +import com.sekwah.advancedportals.core.AdvancedPortalsCore; +import com.sekwah.advancedportals.core.api.destination.Destination; +import com.sekwah.advancedportals.core.api.portal.PortalException; +import com.sekwah.advancedportals.core.entities.DataTag; +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +import java.util.ArrayList; /** + * https://github.com/sekwah41/Advanced-Portals/blob/24175610892152828e21f4ff824eb1589ccb0338/src/com/sekwah/advancedportals/core/api/managers/DestinationManager.java + * Based off the old manager with the data storage and handling moved to {@link com.sekwah.advancedportals.core.repository.DestinationRepository} + */ +public final class DestinationServices { + + /** + * @param portalsCore + */ + public void loadDestinations(AdvancedPortalsCore portalsCore) { + + } + + /** + * @param name + * @param player + * @param loc + * @param destiTags + * @return + */ + public Destination createDesti(String name, PlayerContainer player, PlayerLocation loc, ArrayList destiTags) throws PortalException { + return null; + } +} diff --git a/src/main/java/com/sekwah/advancedportals/core/api/services/PortalServices.java b/src/main/java/com/sekwah/advancedportals/core/api/services/PortalServices.java new file mode 100644 index 0000000..43da30f --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/api/services/PortalServices.java @@ -0,0 +1,45 @@ +package com.sekwah.advancedportals.core.api.services; + +import com.google.common.collect.ImmutableList; +import com.sekwah.advancedportals.core.AdvancedPortalsCore; +import com.sekwah.advancedportals.core.api.portal.AdvancedPortal; +import com.sekwah.advancedportals.core.api.portal.PortalException; +import com.sekwah.advancedportals.core.entities.DataTag; +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +import java.util.ArrayList; +import java.util.Map; + +/** + * https://github.com/sekwah41/Advanced-Portals/blob/24175610892152828e21f4ff824eb1589ccb0338/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java + * + * Based off the old manager with the data storage and handling moved to {@link com.sekwah.advancedportals.core.repository.PortalRepository} + * + * Excluding the temp data like selections + */ +public final class PortalServices { + public void loadPortals(AdvancedPortalsCore advancedPortalsCore) { + + } + + public boolean inPortalRegion(PlayerLocation loc) { + return false; + } + + public boolean playerMove(PlayerContainer player, PlayerLocation fromLoc, PlayerLocation toLoc) { + return false; + } + + public ImmutableList> getPortals() { + return null; + } + + public void removePortal(String name, PlayerContainer player) throws PortalException { + + } + + public AdvancedPortal createPortal(String name, PlayerContainer player, ArrayList portalTags) throws PortalException { + return null; + } +} diff --git a/src/main/java/com/sekwah/advancedportals/core/api/services/PortalTempDataServices.java b/src/main/java/com/sekwah/advancedportals/core/api/services/PortalTempDataServices.java new file mode 100644 index 0000000..0b05e2e --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/api/services/PortalTempDataServices.java @@ -0,0 +1,24 @@ +package com.sekwah.advancedportals.core.api.services; + +import com.sekwah.advancedportals.core.api.portal.PortalException; +import com.sekwah.advancedportals.core.entities.PortalLocation; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +public final class PortalTempDataServices { + + public void activateCooldown(PlayerContainer player) { + + } + + public void playerLeave(PlayerContainer player) { + + } + + public void playerSelectorActivate(PlayerContainer player, PortalLocation blockLoc, boolean leftClick) { + + } + + public void removePlayerSelection(PlayerContainer player) throws PortalException { + + } +} diff --git a/src/com/sekwah/advancedportals/core/api/warphandler/ActivationData.java b/src/main/java/com/sekwah/advancedportals/core/api/warphandler/ActivationData.java similarity index 95% rename from src/com/sekwah/advancedportals/core/api/warphandler/ActivationData.java rename to src/main/java/com/sekwah/advancedportals/core/api/warphandler/ActivationData.java index b40720f..352522e 100644 --- a/src/com/sekwah/advancedportals/core/api/warphandler/ActivationData.java +++ b/src/main/java/com/sekwah/advancedportals/core/api/warphandler/ActivationData.java @@ -1,7 +1,7 @@ package com.sekwah.advancedportals.core.api.warphandler; -import com.sekwah.advancedportals.core.data.PlayerLocation; +import com.sekwah.advancedportals.core.entities.PlayerLocation; /** * Created by on 30/07/2016. diff --git a/src/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java b/src/main/java/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java similarity index 100% rename from src/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java rename to src/main/java/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java diff --git a/src/com/sekwah/advancedportals/core/commands/CommandTemplate.java b/src/main/java/com/sekwah/advancedportals/core/commands/CommandTemplate.java similarity index 100% rename from src/com/sekwah/advancedportals/core/commands/CommandTemplate.java rename to src/main/java/com/sekwah/advancedportals/core/commands/CommandTemplate.java diff --git a/src/com/sekwah/advancedportals/core/commands/CommandWithSubCommands.java b/src/main/java/com/sekwah/advancedportals/core/commands/CommandWithSubCommands.java similarity index 100% rename from src/com/sekwah/advancedportals/core/commands/CommandWithSubCommands.java rename to src/main/java/com/sekwah/advancedportals/core/commands/CommandWithSubCommands.java diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/CreateSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/CreateSubCommand.java similarity index 92% rename from src/com/sekwah/advancedportals/core/commands/subcommands/CreateSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/CreateSubCommand.java index d8ab71a..4f3ecdd 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/CreateSubCommand.java +++ b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/CreateSubCommand.java @@ -1,7 +1,6 @@ package com.sekwah.advancedportals.core.commands.subcommands; -import com.sekwah.advancedportals.core.AdvancedPortalsCore; -import com.sekwah.advancedportals.core.api.portal.DataTag; +import com.sekwah.advancedportals.core.entities.DataTag; import java.util.ArrayList; diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/desti/CreateDestiSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/desti/CreateDestiSubCommand.java similarity index 96% rename from src/com/sekwah/advancedportals/core/commands/subcommands/desti/CreateDestiSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/desti/CreateDestiSubCommand.java index fdaa88e..1cb934a 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/desti/CreateDestiSubCommand.java +++ b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/desti/CreateDestiSubCommand.java @@ -3,7 +3,7 @@ package com.sekwah.advancedportals.core.commands.subcommands.desti; import com.sekwah.advancedportals.core.AdvancedPortalsCore; import com.sekwah.advancedportals.core.api.commands.SubCommand; import com.sekwah.advancedportals.core.api.destination.Destination; -import com.sekwah.advancedportals.core.api.portal.DataTag; +import com.sekwah.advancedportals.core.entities.DataTag; import com.sekwah.advancedportals.core.api.portal.PortalException; import com.sekwah.advancedportals.core.commands.subcommands.CreateSubCommand; import com.sekwah.advancedportals.core.util.Lang; @@ -25,7 +25,7 @@ public class CreateDestiSubCommand extends CreateSubCommand implements SubComman } ArrayList destiTags = this.getTagsFromArgs(args); try { - Destination desti = AdvancedPortalsCore.getDestinationManager().createDesti(args[1], player, player.getLoc(), destiTags); + Destination desti = AdvancedPortalsCore.getDestinationServices().createDesti(args[1], player, player.getLoc(), destiTags); if(desti != null) { sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor("command.createdesti.complete")); sender.sendMessage(Lang.translateColor("command.create.tags")); diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/CreatePortalSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/CreatePortalSubCommand.java similarity index 96% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/CreatePortalSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/CreatePortalSubCommand.java index 59136e6..cf1fe2c 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/CreatePortalSubCommand.java +++ b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/CreatePortalSubCommand.java @@ -3,7 +3,7 @@ package com.sekwah.advancedportals.core.commands.subcommands.portal; import com.sekwah.advancedportals.core.AdvancedPortalsCore; import com.sekwah.advancedportals.core.api.commands.SubCommand; import com.sekwah.advancedportals.core.api.portal.AdvancedPortal; -import com.sekwah.advancedportals.core.api.portal.DataTag; +import com.sekwah.advancedportals.core.entities.DataTag; import com.sekwah.advancedportals.core.api.portal.PortalException; import com.sekwah.advancedportals.core.commands.subcommands.CreateSubCommand; import com.sekwah.advancedportals.core.util.Lang; @@ -27,7 +27,7 @@ public class CreatePortalSubCommand extends CreateSubCommand implements SubComma ArrayList portalTags = this.getTagsFromArgs(args); try { System.out.println(Arrays.toString(portalTags.toArray())); - AdvancedPortal portal = AdvancedPortalsCore.getPortalManager().createPortal(args[1], player, portalTags); + AdvancedPortal portal = AdvancedPortalsCore.getPortalServices().createPortal(args[1], player, portalTags); if(portal != null) { sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor("command.create.complete")); sender.sendMessage(Lang.translateColor("command.create.tags")); diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/EndGatewayBlockSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/EndGatewayBlockSubCommand.java similarity index 100% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/EndGatewayBlockSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/EndGatewayBlockSubCommand.java diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/EndPortalBlockSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/EndPortalBlockSubCommand.java similarity index 100% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/EndPortalBlockSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/EndPortalBlockSubCommand.java diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/PortalBlockSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/PortalBlockSubCommand.java similarity index 100% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/PortalBlockSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/PortalBlockSubCommand.java diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java similarity index 90% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java index 494c14b..24d4156 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java +++ b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java @@ -18,8 +18,8 @@ public class ReloadSubCommand implements SubCommand { @Override public void onCommand(CommandSenderContainer sender, String[] args) { portalsCore.loadPortalConfig(); - portalsCore.getPortalManager().loadPortals(); - portalsCore.getDestinationManager().loadDestinations(); + portalsCore.getPortalServices().loadPortals(portalsCore); + portalsCore.getDestinationServices().loadDestinations(portalsCore); sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor("command.reload.reloaded")); } diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java similarity index 91% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java index b0ef588..1ee34ea 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java +++ b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java @@ -19,7 +19,7 @@ public class RemoveSubCommand implements SubCommand { public void onCommand(CommandSenderContainer sender, String[] args) { if(args.length > 1) { try { - AdvancedPortalsCore.getPortalManager().removePortal(args[1], sender.getPlayerContainer()); + AdvancedPortalsCore.getPortalServices().removePortal(args[1], sender.getPlayerContainer()); sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor("command.remove.complete")); } catch (PortalException portalTagExeption) { sender.sendMessage(Lang.translateColor("messageprefix.negative") @@ -33,7 +33,7 @@ public class RemoveSubCommand implements SubCommand { } else { try { - AdvancedPortalsCore.getPortalManager().removePlayerSelection(player); + AdvancedPortalsCore.getPortalTempDataServices().removePlayerSelection(player); } catch (PortalException portalTagExeption) { sender.sendMessage(Lang.translateColor("messageprefix.negative") + Lang.translateColor("command.remove.error") + " " + Lang.translate(portalTagExeption.getMessage())); @@ -50,7 +50,7 @@ public class RemoveSubCommand implements SubCommand { @Override public List onTabComplete(CommandSenderContainer sender, String[] args) { List portalNames = new ArrayList<>(); - for(Map.Entry portal : AdvancedPortalsCore.getPortalManager().getPortals()) { + for(Map.Entry portal : AdvancedPortalsCore.getPortalServices().getPortals()) { portalNames.add(portal.getKey()); } Collections.sort(portalNames); diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/SelectorSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/SelectorSubCommand.java similarity index 93% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/SelectorSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/SelectorSubCommand.java index 61b356b..1bf79ca 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/SelectorSubCommand.java +++ b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/SelectorSubCommand.java @@ -23,7 +23,7 @@ public class SelectorSubCommand implements SubCommand { sender.sendMessage(Lang.translateColor("messageprefix.negative") + Lang.translate("command.playeronly")); } else { - player.giveItem(this.portalsCore.getConfig().getSelectorMaterial(), "\u00A7ePortal Region Selector" + player.giveItem(this.portalsCore.getConfigRepo().getSelectorMaterial(), "\u00A7ePortal Region Selector" , "\u00A7rThis wand with has the power to help", "\u00A7r create portals bistowed upon it!"); sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translate("command.selector")); } diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java similarity index 100% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/VersionSubCommand.java b/src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/VersionSubCommand.java similarity index 100% rename from src/com/sekwah/advancedportals/core/commands/subcommands/portal/VersionSubCommand.java rename to src/main/java/com/sekwah/advancedportals/core/commands/subcommands/portal/VersionSubCommand.java diff --git a/src/main/java/com/sekwah/advancedportals/core/config/Config.java b/src/main/java/com/sekwah/advancedportals/core/config/Config.java new file mode 100644 index 0000000..c9f23d6 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/config/Config.java @@ -0,0 +1,34 @@ +package com.sekwah.advancedportals.core.config; + +/** + * To store the data for config + */ +public class Config { + + public boolean useOnlySpecialAxe = true; + + public String selectorMaterial = "IRON_AXE"; + + public boolean portalProtection = true; + + public int portalProtectionRaduis = 5; + + public String defaultTriggerBlock = "PORTAL"; + + public boolean stopWaterFlow = true; + + public int portalCooldown = 5; + + public String warpParticles = "ENDER"; + + public String warpSound = "ENDER"; + + public String selectionBlock_BELOW_1_13 = "STAINED_GLASS"; + + public String selectionBlock = "RED_STAINED_GLASS"; + + public String translationFile = "en_GB"; + + public int selectionSubID_BELOW_1_13 = 14; + +} diff --git a/src/main/java/com/sekwah/advancedportals/core/config/RepositoryModule.java b/src/main/java/com/sekwah/advancedportals/core/config/RepositoryModule.java new file mode 100644 index 0000000..3cb150c --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/config/RepositoryModule.java @@ -0,0 +1,33 @@ +package com.sekwah.advancedportals.core.config; + +import com.google.inject.AbstractModule; +import com.google.inject.Provides; +import com.google.inject.Scopes; +import com.google.inject.name.Named; +import com.sekwah.advancedportals.core.AdvancedPortalsCore; +import com.sekwah.advancedportals.core.repository.*; + +import java.util.Properties; + +public class RepositoryModule extends AbstractModule { + + private final AdvancedPortalsCore portalsCore; + + public RepositoryModule(AdvancedPortalsCore portalsCore) { + this.portalsCore = portalsCore; + } + + @Override + protected void configure() { + bind(PortalRepository.class).to(PortalRepositoryImpl.class).in(Scopes.SINGLETON); + bind(DestinationRepository.class).to(DestinationRepositoryImpl.class).in(Scopes.SINGLETON); + bind(PortalTempDataRepository.class).to(PortalTempDataRepositoryImpl.class).in(Scopes.SINGLETON); + bind(ConfigRepository.class).to(ConfigRepositoryImpl.class).in(Scopes.SINGLETON); + } + + @Provides + @Named("portals-core") + AdvancedPortalsCore providePortalsCore() { + return this.portalsCore; + } +} diff --git a/src/com/sekwah/advancedportals/core/util/DataStorage.java b/src/main/java/com/sekwah/advancedportals/core/data/DataStorage.java similarity index 97% rename from src/com/sekwah/advancedportals/core/util/DataStorage.java rename to src/main/java/com/sekwah/advancedportals/core/data/DataStorage.java index ae3e20b..80eb5da 100644 --- a/src/com/sekwah/advancedportals/core/util/DataStorage.java +++ b/src/main/java/com/sekwah/advancedportals/core/data/DataStorage.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.core.util; +package com.sekwah.advancedportals.core.data; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -83,7 +83,7 @@ public class DataStorage { } if (!outFile.exists() || overwrite) { try { - InputStream inputStream = DataStorage.class.getClassLoader().getResourceAsStream(fileLoc); + InputStream inputStream = DataStorage.class.getResourceAsStream(fileLoc); if(inputStream == null) { return false; } diff --git a/src/com/sekwah/advancedportals/core/api/portal/DataTag.java b/src/main/java/com/sekwah/advancedportals/core/entities/DataTag.java similarity index 79% rename from src/com/sekwah/advancedportals/core/api/portal/DataTag.java rename to src/main/java/com/sekwah/advancedportals/core/entities/DataTag.java index 4f8e2da..2b85bcd 100644 --- a/src/com/sekwah/advancedportals/core/api/portal/DataTag.java +++ b/src/main/java/com/sekwah/advancedportals/core/entities/DataTag.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.core.api.portal; +package com.sekwah.advancedportals.core.entities; public class DataTag { diff --git a/src/com/sekwah/advancedportals/core/data/PlayerLocation.java b/src/main/java/com/sekwah/advancedportals/core/entities/PlayerLocation.java similarity index 95% rename from src/com/sekwah/advancedportals/core/data/PlayerLocation.java rename to src/main/java/com/sekwah/advancedportals/core/entities/PlayerLocation.java index dc2aac6..9422236 100644 --- a/src/com/sekwah/advancedportals/core/data/PlayerLocation.java +++ b/src/main/java/com/sekwah/advancedportals/core/entities/PlayerLocation.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.core.data; +package com.sekwah.advancedportals.core.entities; import com.google.gson.annotations.SerializedName; diff --git a/src/com/sekwah/advancedportals/core/data/PortalLocation.java b/src/main/java/com/sekwah/advancedportals/core/entities/PortalLocation.java similarity index 90% rename from src/com/sekwah/advancedportals/core/data/PortalLocation.java rename to src/main/java/com/sekwah/advancedportals/core/entities/PortalLocation.java index 2cca869..d1caaf4 100644 --- a/src/com/sekwah/advancedportals/core/data/PortalLocation.java +++ b/src/main/java/com/sekwah/advancedportals/core/entities/PortalLocation.java @@ -1,4 +1,4 @@ -package com.sekwah.advancedportals.core.data; +package com.sekwah.advancedportals.core.entities; import com.google.gson.annotations.SerializedName; diff --git a/src/main/java/com/sekwah/advancedportals/core/enums/EnumHandSelection.java b/src/main/java/com/sekwah/advancedportals/core/enums/EnumHandSelection.java new file mode 100644 index 0000000..1c96d2d --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/enums/EnumHandSelection.java @@ -0,0 +1,6 @@ +package com.sekwah.advancedportals.core.enums; + +public enum EnumHandSelection { + LEFTHAND, + RIGHTHAND +} diff --git a/src/main/java/com/sekwah/advancedportals/core/repository/ConfigRepository.java b/src/main/java/com/sekwah/advancedportals/core/repository/ConfigRepository.java new file mode 100644 index 0000000..e0bd28c --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/repository/ConfigRepository.java @@ -0,0 +1,16 @@ +package com.sekwah.advancedportals.core.repository; + +import com.sekwah.advancedportals.core.data.DataStorage; + +public interface ConfigRepository { + + boolean getUseOnlySpecialAxe(); + + void setUseOnlySpecialAxe(boolean useOnlyServerMadeAxe); + + String getTranslation(); + + String getSelectorMaterial(); + + void loadConfig(DataStorage dataStorage); +} diff --git a/src/main/java/com/sekwah/advancedportals/core/repository/ConfigRepositoryImpl.java b/src/main/java/com/sekwah/advancedportals/core/repository/ConfigRepositoryImpl.java new file mode 100644 index 0000000..e0fa687 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/repository/ConfigRepositoryImpl.java @@ -0,0 +1,34 @@ +package com.sekwah.advancedportals.core.repository; + +import com.sekwah.advancedportals.core.config.Config; +import com.sekwah.advancedportals.core.data.DataStorage; + +import javax.inject.Singleton; + +@Singleton +public class ConfigRepositoryImpl implements ConfigRepository { + + private Config config; + + public boolean getUseOnlySpecialAxe() { + return this.config.useOnlySpecialAxe; + } + + public void setUseOnlySpecialAxe(boolean useOnlyServerMadeAxe) { + this.config.useOnlySpecialAxe = useOnlyServerMadeAxe; + } + + public String getTranslation() { + return this.config.translationFile; + } + + public String getSelectorMaterial() { + return this.config.selectorMaterial; + } + + @Override + public void loadConfig(DataStorage dataStorage) { + this.config = dataStorage.loadJson(Config.class, "config.json"); + } + +} diff --git a/src/main/java/com/sekwah/advancedportals/core/repository/DestinationRepository.java b/src/main/java/com/sekwah/advancedportals/core/repository/DestinationRepository.java new file mode 100644 index 0000000..ed0ff28 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/repository/DestinationRepository.java @@ -0,0 +1,14 @@ +package com.sekwah.advancedportals.core.repository; + +import com.google.common.collect.ImmutableMap; +import com.sekwah.advancedportals.core.api.destination.Destination; + +public interface DestinationRepository { + void create(String name, Destination destination); + + void delete(String name); + + ImmutableMap getDestinations(); + + void loadDestinations(); +} diff --git a/src/com/sekwah/advancedportals/core/api/managers/DestinationManager.java b/src/main/java/com/sekwah/advancedportals/core/repository/DestinationRepositoryImpl.java similarity index 54% rename from src/com/sekwah/advancedportals/core/api/managers/DestinationManager.java rename to src/main/java/com/sekwah/advancedportals/core/repository/DestinationRepositoryImpl.java index 8455048..87e1d34 100644 --- a/src/com/sekwah/advancedportals/core/api/managers/DestinationManager.java +++ b/src/main/java/com/sekwah/advancedportals/core/repository/DestinationRepositoryImpl.java @@ -1,33 +1,46 @@ -package com.sekwah.advancedportals.core.api.managers; +package com.sekwah.advancedportals.core.repository; +import com.google.common.collect.ImmutableMap; import com.google.gson.reflect.TypeToken; +import com.google.inject.Singleton; import com.sekwah.advancedportals.core.AdvancedPortalsCore; import com.sekwah.advancedportals.core.api.destination.Destination; -import com.sekwah.advancedportals.core.api.portal.DataTag; +import com.sekwah.advancedportals.core.entities.DataTag; import com.sekwah.advancedportals.core.api.portal.PortalException; import com.sekwah.advancedportals.core.api.warphandler.TagHandler; -import com.sekwah.advancedportals.core.data.PlayerLocation; +import com.sekwah.advancedportals.core.entities.PlayerLocation; import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashMap; +import java.util.Map; -/** - * @author sekwah41 - */ -public class DestinationManager { +@Singleton +public class DestinationRepositoryImpl implements DestinationRepository { + private Map destiHashMap = new HashMap<>(); - private final AdvancedPortalsCore portalsCore; - /** - * Contains all the data for the destinations - */ - private HashMap destiHashMap = new HashMap<>(); - - public DestinationManager(AdvancedPortalsCore portalsCore) { - this.portalsCore = portalsCore; + @Override + public void create(String name, Destination destination) { + destiHashMap.put(name, destination); } + @Override + public void delete(String name) { + destiHashMap.remove(name); + } + + @Override + public ImmutableMap getDestinations() { + return ImmutableMap.copyOf(destiHashMap); + } + + @Override + public void loadDestinations() { + + } + + public Destination createDesti(String name, PlayerContainer player, PlayerLocation playerLocation, ArrayList tags) throws PortalException { if(name == null || name.equals("")) { throw new PortalException("desti.error.noname"); @@ -47,23 +60,25 @@ public class DestinationManager { } } this.destiHashMap.put(name, desti); - AdvancedPortalsCore.getDestinationManager().saveDestinations(); + this.saveDestinations(AdvancedPortalsCore.getInstance()); return desti; } - - - public void loadDestinations() { + /** + * TODO change these, may be good if the data storage was an inject as well as it would save time and clean up layout + * @param portalsCore + */ + public void loadDestinations(AdvancedPortalsCore portalsCore) { Type type = new TypeToken>() { }.getType(); - this.destiHashMap = this.portalsCore.getDataStorage().loadJson(type, "destinations.json"); - this.saveDestinations(); + this.destiHashMap = portalsCore.getDataStorage().loadJson(type, "destinations.json"); + this.saveDestinations(portalsCore); } - public void saveDestinations() { + public void saveDestinations(AdvancedPortalsCore portalsCore) { if (this.destiHashMap == null) { this.destiHashMap = new HashMap<>(); } - this.portalsCore.getDataStorage().storeJson(this.destiHashMap, "destinations.json"); + portalsCore.getDataStorage().storeJson(this.destiHashMap, "destinations.json"); } } diff --git a/src/main/java/com/sekwah/advancedportals/core/repository/PortalRepository.java b/src/main/java/com/sekwah/advancedportals/core/repository/PortalRepository.java new file mode 100644 index 0000000..8eb8d05 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/repository/PortalRepository.java @@ -0,0 +1,13 @@ +package com.sekwah.advancedportals.core.repository; + +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +public interface PortalRepository { + + void loadPortals(); + + void savePortals(); + + boolean playerMove(PlayerContainer player, PlayerLocation fromLoc, PlayerLocation toLoc); +} diff --git a/src/main/java/com/sekwah/advancedportals/core/repository/PortalRepositoryImpl.java b/src/main/java/com/sekwah/advancedportals/core/repository/PortalRepositoryImpl.java new file mode 100644 index 0000000..795d42f --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/repository/PortalRepositoryImpl.java @@ -0,0 +1,23 @@ +package com.sekwah.advancedportals.core.repository; + +import com.google.inject.Singleton; +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +@Singleton +public class PortalRepositoryImpl implements PortalRepository { + @Override + public void loadPortals() { + + } + + @Override + public void savePortals() { + + } + + @Override + public boolean playerMove(PlayerContainer player, PlayerLocation fromLoc, PlayerLocation toLoc) { + return false; + } +} diff --git a/src/main/java/com/sekwah/advancedportals/core/repository/PortalTempDataRepository.java b/src/main/java/com/sekwah/advancedportals/core/repository/PortalTempDataRepository.java new file mode 100644 index 0000000..d779b4e --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/repository/PortalTempDataRepository.java @@ -0,0 +1,26 @@ +package com.sekwah.advancedportals.core.repository; + +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.core.entities.PortalLocation; +import com.sekwah.advancedportals.core.enums.EnumHandSelection; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +import java.util.UUID; + +public interface PortalTempDataRepository { + void addSelectedPortal(UUID selectedPlayer, String portal); + + void removeSelectedPortal(UUID uuid); + + void addSelectedHand(UUID uuid, EnumHandSelection enumHandSelection, PortalLocation portalLocation); + + void removeSelectedHand(UUID uuid, EnumHandSelection enumHandSelection); + + void removeAllSelectedHand(UUID uuid); + + void activateCooldown(PlayerContainer player); + + void playerLeave(PlayerContainer player); + + boolean inPortalRegion(PlayerLocation loc); +} diff --git a/src/main/java/com/sekwah/advancedportals/core/repository/PortalTempDataRepositoryImpl.java b/src/main/java/com/sekwah/advancedportals/core/repository/PortalTempDataRepositoryImpl.java new file mode 100644 index 0000000..83371c3 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/core/repository/PortalTempDataRepositoryImpl.java @@ -0,0 +1,65 @@ +package com.sekwah.advancedportals.core.repository; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import com.google.inject.Singleton; +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.core.entities.PortalLocation; +import com.sekwah.advancedportals.core.enums.EnumHandSelection; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@Singleton +public class PortalTempDataRepositoryImpl implements PortalTempDataRepository { + Cache selectedPortal = CacheBuilder.newBuilder() + .concurrencyLevel(4) + .expireAfterAccess(30, TimeUnit.DAYS) + .build(); + + Table selectedHand = HashBasedTable.create(); + + @Override + public void addSelectedPortal(UUID selectedPlayer, String portal) { + selectedPortal.put(selectedPlayer, portal); + } + + @Override + public void removeSelectedPortal(UUID uuid) { + selectedPortal.invalidate(uuid); + } + + @Override + public void addSelectedHand(UUID uuid, EnumHandSelection enumHandSelection, PortalLocation portalLocation) { + selectedHand.put(uuid, enumHandSelection, portalLocation); + } + + @Override + public void removeSelectedHand(UUID uuid, EnumHandSelection enumHandSelection) { + selectedHand.remove(uuid, enumHandSelection); + } + + @Override + public void removeAllSelectedHand(UUID uuid) { + selectedHand.remove(uuid, EnumHandSelection.LEFTHAND); + selectedHand.remove(uuid, EnumHandSelection.RIGHTHAND); + } + + @Override + public void activateCooldown(PlayerContainer player) { + + } + + @Override + public void playerLeave(PlayerContainer player) { + + } + + @Override + public boolean inPortalRegion(PlayerLocation loc) { + return false; + } +} diff --git a/src/com/sekwah/advancedportals/core/util/InfoLogger.java b/src/main/java/com/sekwah/advancedportals/core/util/InfoLogger.java similarity index 81% rename from src/com/sekwah/advancedportals/core/util/InfoLogger.java rename to src/main/java/com/sekwah/advancedportals/core/util/InfoLogger.java index 2f70349..9740d7c 100644 --- a/src/com/sekwah/advancedportals/core/util/InfoLogger.java +++ b/src/main/java/com/sekwah/advancedportals/core/util/InfoLogger.java @@ -4,13 +4,13 @@ public abstract class InfoLogger { /** * Problematic messages - * @param s + * @param s warning message */ public abstract void logWarning(String s); /** * General information logging - * @param s + * @param s info message */ public abstract void log(String s); } diff --git a/src/com/sekwah/advancedportals/core/util/Lang.java b/src/main/java/com/sekwah/advancedportals/core/util/Lang.java similarity index 100% rename from src/com/sekwah/advancedportals/core/util/Lang.java rename to src/main/java/com/sekwah/advancedportals/core/util/Lang.java diff --git a/src/com/sekwah/advancedportals/coreconnector/ConnectorDataCollector.java b/src/main/java/com/sekwah/advancedportals/coreconnector/ConnectorDataCollector.java similarity index 100% rename from src/com/sekwah/advancedportals/coreconnector/ConnectorDataCollector.java rename to src/main/java/com/sekwah/advancedportals/coreconnector/ConnectorDataCollector.java diff --git a/src/main/java/com/sekwah/advancedportals/coreconnector/command/CommandHandler.java b/src/main/java/com/sekwah/advancedportals/coreconnector/command/CommandHandler.java new file mode 100644 index 0000000..6b70aff --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/coreconnector/command/CommandHandler.java @@ -0,0 +1,30 @@ +package com.sekwah.advancedportals.coreconnector.command; + +import com.sekwah.advancedportals.core.commands.CommandTemplate; +import com.sekwah.advancedportals.coreconnector.container.CommandSenderContainer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; + +import java.util.List; + +public class CommandHandler implements CommandExecutor, TabCompleter { + + private final CommandTemplate commandExecutor; + + public CommandHandler(CommandTemplate commandExecutor) { + this.commandExecutor = commandExecutor; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) { + this.commandExecutor.onCommand(new CommandSenderContainer(commandSender), command.getName(), args); + return true; + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] args) { + return this.commandExecutor.onTabComplete(new CommandSenderContainer(commandSender), args); + } +} diff --git a/src/com/sekwah/advancedportals/coreconnector/command/CommandRegister.java b/src/main/java/com/sekwah/advancedportals/coreconnector/command/CommandRegister.java similarity index 100% rename from src/com/sekwah/advancedportals/coreconnector/command/CommandRegister.java rename to src/main/java/com/sekwah/advancedportals/coreconnector/command/CommandRegister.java diff --git a/src/com/sekwah/advancedportals/coreconnector/container/CommandSenderContainer.java b/src/main/java/com/sekwah/advancedportals/coreconnector/container/CommandSenderContainer.java similarity index 100% rename from src/com/sekwah/advancedportals/coreconnector/container/CommandSenderContainer.java rename to src/main/java/com/sekwah/advancedportals/coreconnector/container/CommandSenderContainer.java diff --git a/src/com/sekwah/advancedportals/coreconnector/container/PlayerContainer.java b/src/main/java/com/sekwah/advancedportals/coreconnector/container/PlayerContainer.java similarity index 95% rename from src/com/sekwah/advancedportals/coreconnector/container/PlayerContainer.java rename to src/main/java/com/sekwah/advancedportals/coreconnector/container/PlayerContainer.java index fa2de02..12e1752 100644 --- a/src/com/sekwah/advancedportals/coreconnector/container/PlayerContainer.java +++ b/src/main/java/com/sekwah/advancedportals/coreconnector/container/PlayerContainer.java @@ -1,7 +1,5 @@ package com.sekwah.advancedportals.coreconnector.container; -import com.sekwah.advancedportals.core.data.PlayerLocation; -import com.sekwah.advancedportals.core.data.PortalLocation; import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; @@ -10,8 +8,10 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.Wool; - import java.util.Arrays; +import com.sekwah.advancedportals.core.entities.PlayerLocation; +import com.sekwah.advancedportals.core.entities.PortalLocation; + import java.util.UUID; /** diff --git a/src/com/sekwah/advancedportals/coreconnector/container/WorldContainer.java b/src/main/java/com/sekwah/advancedportals/coreconnector/container/WorldContainer.java similarity index 95% rename from src/com/sekwah/advancedportals/coreconnector/container/WorldContainer.java rename to src/main/java/com/sekwah/advancedportals/coreconnector/container/WorldContainer.java index 02aaee4..b5d2a33 100644 --- a/src/com/sekwah/advancedportals/coreconnector/container/WorldContainer.java +++ b/src/main/java/com/sekwah/advancedportals/coreconnector/container/WorldContainer.java @@ -1,11 +1,11 @@ package com.sekwah.advancedportals.coreconnector.container; -import com.sekwah.advancedportals.core.data.PortalLocation; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.BlockFace; import org.bukkit.material.Directional; import org.bukkit.material.MaterialData; +import com.sekwah.advancedportals.core.entities.PortalLocation; public class WorldContainer { diff --git a/src/main/java/com/sekwah/advancedportals/metrics/Metrics.java b/src/main/java/com/sekwah/advancedportals/metrics/Metrics.java new file mode 100644 index 0000000..b41f33c --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/metrics/Metrics.java @@ -0,0 +1,773 @@ +/* + * Copyright 2011-2013 Tyler Blair. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and contributors and should not be interpreted as representing official policies, + * either expressed or implied, of anybody else. + */ +package com.sekwah.advancedportals.metrics; + +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.scheduler.BukkitTask; + +import java.io.*; +import java.lang.reflect.Method; +import java.net.Proxy; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLEncoder; +import java.util.*; +import java.util.logging.Level; +import java.util.zip.GZIPOutputStream; + +public class Metrics { + + /** + * The current revision number + */ + private final static int REVISION = 7; + + /** + * The base url of the metrics domain + */ + private static final String BASE_URL = "http://report.mcstats.org"; + + /** + * The url used to report a server's status + */ + private static final String REPORT_URL = "/plugin/%s"; + + /** + * Interval of time to ping (in minutes) + */ + private static final int PING_INTERVAL = 15; + + /** + * The plugin this metrics submits for + */ + private final Plugin plugin; + + /** + * All of the custom graphs to submit to metrics + */ + private final Set graphs = Collections.synchronizedSet(new HashSet()); + + /** + * The plugin configuration file + */ + private final YamlConfiguration configuration; + + /** + * The plugin configuration file + */ + private final File configurationFile; + + /** + * Unique server id + */ + private final String guid; + + /** + * Debug mode + */ + private final boolean debug; + + /** + * Lock for synchronization + */ + private final Object optOutLock = new Object(); + + /** + * The scheduled task + */ + private volatile BukkitTask task = null; + + public Metrics(final Plugin plugin) throws IOException { + if (plugin == null) { + throw new IllegalArgumentException("Plugin cannot be null"); + } + + this.plugin = plugin; + + // load the config + configurationFile = getConfigFile(); + configuration = YamlConfiguration.loadConfiguration(configurationFile); + + // add some defaults + configuration.addDefault("opt-out", false); + configuration.addDefault("guid", UUID.randomUUID().toString()); + configuration.addDefault("debug", false); + + // Do we need to create the file? + if (configuration.get("guid", null) == null) { + configuration.options().header("http://mcstats.org").copyDefaults(true); + configuration.save(configurationFile); + } + + // Load the guid then + guid = configuration.getString("guid"); + debug = configuration.getBoolean("debug", false); + } + + /** + * Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics + * website. Plotters can be added to the graph object returned. + * + * @param name The name of the graph + * @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given + */ + public Graph createGraph(final String name) { + if (name == null) { + throw new IllegalArgumentException("Graph name cannot be null"); + } + + // Construct the graph object + final Graph graph = new Graph(name); + + // Now we can add our graph + graphs.add(graph); + + // and return back + return graph; + } + + /** + * Add a Graph object to BukkitMetrics that represents data for the plugin that should be sent to the backend + * + * @param graph The name of the graph + */ + public void addGraph(final Graph graph) { + if (graph == null) { + throw new IllegalArgumentException("Graph cannot be null"); + } + + graphs.add(graph); + } + + /** + * Start measuring statistics. This will immediately create an async repeating task as the plugin and send the + * initial data to the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200 + * ticks. + * + * @return True if statistics measuring is running, otherwise false. + */ + public boolean start() { + synchronized (optOutLock) { + // Did we opt out? + if (isOptOut()) { + return false; + } + + // Is metrics already running? + if (task != null) { + return true; + } + + // Begin hitting the server with glorious data + task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() { + + private boolean firstPost = true; + + public void run() { + try { + // This has to be synchronized or it can collide with the disable method. + synchronized (optOutLock) { + // Disable Task, if it is running and the server owner decided to opt-out + if (isOptOut() && task != null) { + task.cancel(); + task = null; + // Tell all plotters to stop gathering information. + for (Graph graph : graphs) { + graph.onOptOut(); + } + } + } + + // We use the inverse of firstPost because if it is the first time we are posting, + // it is not a interval ping, so it evaluates to FALSE + // Each time thereafter it will evaluate to TRUE, i.e PING! + postPlugin(!firstPost); + + // After the first post we set firstPost to false + // Each post thereafter will be a ping + firstPost = false; + } catch (IOException e) { + if (debug) { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage()); + } + } + } + }, 0, PING_INTERVAL * 1200); + + return true; + } + } + + /** + * Has the server owner denied plugin metrics? + * + * @return true if metrics should be opted out of it + */ + public boolean isOptOut() { + synchronized (optOutLock) { + try { + // Reload the metrics file + configuration.load(getConfigFile()); + } catch (IOException ex) { + if (debug) { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + } + return true; + } catch (InvalidConfigurationException ex) { + if (debug) { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + } + return true; + } + return configuration.getBoolean("opt-out", false); + } + } + + /** + * Enables metrics for the server by setting "opt-out" to false in the config file and starting the metrics task. + * + * @throws java.io.IOException + */ + public void enable() throws IOException { + // This has to be synchronized or it can collide with the check in the task. + synchronized (optOutLock) { + // Check if the server owner has already set opt-out, if not, set it. + if (isOptOut()) { + configuration.set("opt-out", false); + configuration.save(configurationFile); + } + + // Enable Task, if it is not running + if (task == null) { + start(); + } + } + } + + /** + * Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task. + * + * @throws java.io.IOException + */ + public void disable() throws IOException { + // This has to be synchronized or it can collide with the check in the task. + synchronized (optOutLock) { + // Check if the server owner has already set opt-out, if not, set it. + if (!isOptOut()) { + configuration.set("opt-out", true); + configuration.save(configurationFile); + } + + // Disable Task, if it is running + if (task != null) { + task.cancel(); + task = null; + } + } + } + + /** + * Gets the File object of the config file that should be used to store data such as the GUID and opt-out status + * + * @return the File object for the config file + */ + public File getConfigFile() { + // I believe the easiest way to get the base folder (e.g craftbukkit set via -P) for plugins to use + // is to abuse the plugin object we already have + // plugin.getDataFolder() => base/plugins/PluginA/ + // pluginsFolder => base/plugins/ + // The base is not necessarily relative to the startup directory. + File pluginsFolder = plugin.getDataFolder().getParentFile(); + + // return => base/plugins/PluginMetrics/config.yml + return new File(new File(pluginsFolder, "PluginMetrics"), "config.yml"); + } + + /** + * Gets the online player (backwards compatibility) + * + * @return online player amount + */ + private int getOnlinePlayers() { + try { + Method onlinePlayerMethod = Server.class.getMethod("getOnlinePlayers"); + if(onlinePlayerMethod.getReturnType().equals(Collection.class)) { + return ((Collection)onlinePlayerMethod.invoke(Bukkit.getServer())).size(); + } else { + return ((Player[])onlinePlayerMethod.invoke(Bukkit.getServer())).length; + } + } catch (Exception ex) { + if (debug) { + Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage()); + } + } + + return 0; + } + + /** + * Generic method that posts a plugin to the metrics website + */ + private void postPlugin(final boolean isPing) throws IOException { + // Server software specific section + PluginDescriptionFile description = plugin.getDescription(); + String pluginName = description.getName(); + boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled + String pluginVersion = description.getVersion(); + String serverVersion = Bukkit.getVersion(); + int playersOnline = this.getOnlinePlayers(); + + // END server software specific section -- all code below does not use any code outside of this class / Java + + // Construct the post data + StringBuilder json = new StringBuilder(1024); + json.append('{'); + + // The plugin's description file containg all of the plugin data such as name, version, author, etc + appendJSONPair(json, "guid", guid); + appendJSONPair(json, "plugin_version", pluginVersion); + appendJSONPair(json, "server_version", serverVersion); + appendJSONPair(json, "players_online", Integer.toString(playersOnline)); + + // New data as of R6 + String osname = System.getProperty("os.name"); + String osarch = System.getProperty("os.arch"); + String osversion = System.getProperty("os.version"); + String java_version = System.getProperty("java.version"); + int coreCount = Runtime.getRuntime().availableProcessors(); + + // normalize os arch .. amd64 -> x86_64 + if (osarch.equals("amd64")) { + osarch = "x86_64"; + } + + appendJSONPair(json, "osname", osname); + appendJSONPair(json, "osarch", osarch); + appendJSONPair(json, "osversion", osversion); + appendJSONPair(json, "cores", Integer.toString(coreCount)); + appendJSONPair(json, "auth_mode", onlineMode ? "1" : "0"); + appendJSONPair(json, "java_version", java_version); + + // If we're pinging, append it + if (isPing) { + appendJSONPair(json, "ping", "1"); + } + + if (graphs.size() > 0) { + synchronized (graphs) { + json.append(','); + json.append('"'); + json.append("graphs"); + json.append('"'); + json.append(':'); + json.append('{'); + + boolean firstGraph = true; + + final Iterator iter = graphs.iterator(); + + while (iter.hasNext()) { + Graph graph = iter.next(); + + StringBuilder graphJson = new StringBuilder(); + graphJson.append('{'); + + for (Plotter plotter : graph.getPlotters()) { + appendJSONPair(graphJson, plotter.getColumnName(), Integer.toString(plotter.getValue())); + } + + graphJson.append('}'); + + if (!firstGraph) { + json.append(','); + } + + json.append(escapeJSON(graph.getName())); + json.append(':'); + json.append(graphJson); + + firstGraph = false; + } + + json.append('}'); + } + } + + // close json + json.append('}'); + + // Create the url + URL url = new URL(BASE_URL + String.format(REPORT_URL, urlEncode(pluginName))); + + // Connect to the website + URLConnection connection; + + // Mineshafter creates a socks proxy, so we can safely bypass it + // It does not reroute POST requests so we need to go around it + if (isMineshafterPresent()) { + connection = url.openConnection(Proxy.NO_PROXY); + } else { + connection = url.openConnection(); + } + + + byte[] uncompressed = json.toString().getBytes(); + byte[] compressed = gzip(json.toString()); + + // Headers + connection.addRequestProperty("User-Agent", "MCStats/" + REVISION); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("Content-Encoding", "gzip"); + connection.addRequestProperty("Content-Length", Integer.toString(compressed.length)); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + + connection.setDoOutput(true); + + if (debug) { + System.out.println("[Metrics] Prepared request for " + pluginName + " uncompressed=" + uncompressed.length + " compressed=" + compressed.length); + } + + // Write the data + OutputStream os = connection.getOutputStream(); + os.write(compressed); + os.flush(); + + // Now read the response + final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String response = reader.readLine(); + + // close resources + os.close(); + reader.close(); + + if (response == null || response.startsWith("ERR") || response.startsWith("7")) { + if (response == null) { + response = "null"; + } else if (response.startsWith("7")) { + response = response.substring(response.startsWith("7,") ? 2 : 1); + } + + throw new IOException(response); + } else { + // Is this the first update this hour? + if (response.equals("1") || response.contains("This is your first update this hour")) { + synchronized (graphs) { + final Iterator iter = graphs.iterator(); + + while (iter.hasNext()) { + final Graph graph = iter.next(); + + for (Plotter plotter : graph.getPlotters()) { + plotter.reset(); + } + } + } + } + } + } + + /** + * GZip compress a string of bytes + * + * @param input + * @return + */ + public static byte[] gzip(String input) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gzos = null; + + try { + gzos = new GZIPOutputStream(baos); + gzos.write(input.getBytes("UTF-8")); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (gzos != null) try { + gzos.close(); + } catch (IOException ignore) { + } + } + + return baos.toByteArray(); + } + + /** + * Check if mineshafter is present. If it is, we need to bypass it to send POST requests + * + * @return true if mineshafter is installed on the server + */ + private boolean isMineshafterPresent() { + try { + Class.forName("mineshafter.MineServer"); + return true; + } catch (Exception e) { + return false; + } + } + + /** + * Appends a json encoded key/value pair to the given string builder. + * + * @param json + * @param key + * @param value + * @throws UnsupportedEncodingException + */ + private static void appendJSONPair(StringBuilder json, String key, String value) throws UnsupportedEncodingException { + boolean isValueNumeric = false; + + try { + if (value.equals("0") || !value.endsWith("0")) { + Double.parseDouble(value); + isValueNumeric = true; + } + } catch (NumberFormatException e) { + isValueNumeric = false; + } + + if (json.charAt(json.length() - 1) != '{') { + json.append(','); + } + + json.append(escapeJSON(key)); + json.append(':'); + + if (isValueNumeric) { + json.append(value); + } else { + json.append(escapeJSON(value)); + } + } + + /** + * Escape a string to create a valid JSON string + * + * @param text + * @return + */ + private static String escapeJSON(String text) { + StringBuilder builder = new StringBuilder(); + + builder.append('"'); + for (int index = 0; index < text.length(); index++) { + char chr = text.charAt(index); + + switch (chr) { + case '"': + case '\\': + builder.append('\\'); + builder.append(chr); + break; + case '\b': + builder.append("\\b"); + break; + case '\t': + builder.append("\\t"); + break; + case '\n': + builder.append("\\n"); + break; + case '\r': + builder.append("\\r"); + break; + default: + if (chr < ' ') { + String t = "000" + Integer.toHexString(chr); + builder.append("\\u" + t.substring(t.length() - 4)); + } else { + builder.append(chr); + } + break; + } + } + builder.append('"'); + + return builder.toString(); + } + + /** + * Encode text as UTF-8 + * + * @param text the text to encode + * @return the encoded text, as UTF-8 + */ + private static String urlEncode(final String text) throws UnsupportedEncodingException { + return URLEncoder.encode(text, "UTF-8"); + } + + /** + * Represents a custom graph on the website + */ + public static class Graph { + + /** + * The graph's name, alphanumeric and spaces only :) If it does not comply to the above when submitted, it is + * rejected + */ + private final String name; + + /** + * The set of plotters that are contained within this graph + */ + private final Set plotters = new LinkedHashSet(); + + private Graph(final String name) { + this.name = name; + } + + /** + * Gets the graph's name + * + * @return the Graph's name + */ + public String getName() { + return name; + } + + /** + * Add a plotter to the graph, which will be used to plot entries + * + * @param plotter the plotter to add to the graph + */ + public void addPlotter(final Plotter plotter) { + plotters.add(plotter); + } + + /** + * Remove a plotter from the graph + * + * @param plotter the plotter to remove from the graph + */ + public void removePlotter(final Plotter plotter) { + plotters.remove(plotter); + } + + /** + * Gets an unmodifiable set of the plotter objects in the graph + * + * @return an unmodifiable {@link java.util.Set} of the plotter objects + */ + public Set getPlotters() { + return Collections.unmodifiableSet(plotters); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + @Override + public boolean equals(final Object object) { + if (!(object instanceof Graph)) { + return false; + } + + final Graph graph = (Graph) object; + return graph.name.equals(name); + } + + /** + * Called when the server owner decides to opt-out of BukkitMetrics while the server is running. + */ + protected void onOptOut() { + } + } + + /** + * Interface used to collect custom data for a plugin + */ + public static abstract class Plotter { + + /** + * The plot's name + */ + private final String name; + + /** + * Construct a plotter with the default plot name + */ + public Plotter() { + this("Default"); + } + + /** + * Construct a plotter with a specific plot name + * + * @param name the name of the plotter to use, which will show up on the website + */ + public Plotter(final String name) { + this.name = name; + } + + /** + * Get the current value for the plotted point. Since this function defers to an external function it may or may + * not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called + * from any thread so care should be taken when accessing resources that need to be synchronized. + * + * @return the current value for the point to be plotted. + */ + public abstract int getValue(); + + /** + * Get the column name for the plotted point + * + * @return the plotted point's column name + */ + public String getColumnName() { + return name; + } + + /** + * Called after the website graphs have been updated + */ + public void reset() { + } + + @Override + public int hashCode() { + return getColumnName().hashCode(); + } + + @Override + public boolean equals(final Object object) { + if (!(object instanceof Plotter)) { + return false; + } + + final Plotter plotter = (Plotter) object; + return plotter.name.equals(name) && plotter.getValue() == getValue(); + } + } +} diff --git a/src/main/java/com/sekwah/advancedportals/spigot/AdvancedPortalsPlugin.java b/src/main/java/com/sekwah/advancedportals/spigot/AdvancedPortalsPlugin.java new file mode 100644 index 0000000..1157fde --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/spigot/AdvancedPortalsPlugin.java @@ -0,0 +1,27 @@ +package com.sekwah.advancedportals.spigot; + +import com.sekwah.advancedportals.core.AdvancedPortalsCore; +import com.sekwah.advancedportals.core.data.DataStorage; +import com.sekwah.advancedportals.coreconnector.ConnectorDataCollector; +import com.sekwah.advancedportals.coreconnector.command.CommandRegister; +import org.bukkit.plugin.java.JavaPlugin; + +public class AdvancedPortalsPlugin extends JavaPlugin { + + private AdvancedPortalsCore portalsCore; + + public void onEnable() { + // TODO actually get the minecraft version + this.portalsCore = new AdvancedPortalsCore(new DataStorage(this.getDataFolder()), + new SpigotInfoLogger(this), new CommandRegister(this), new ConnectorDataCollector(), new int[]{1,12,2}); + this.getServer().getPluginManager().registerEvents(new Listeners(this), this); + } + + public void onDisable() { + this.portalsCore.onDisable(); + } + + public AdvancedPortalsCore getPortalsCore() { + return portalsCore; + } +} diff --git a/src/main/java/com/sekwah/advancedportals/spigot/Listeners.java b/src/main/java/com/sekwah/advancedportals/spigot/Listeners.java new file mode 100644 index 0000000..6f66054 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/spigot/Listeners.java @@ -0,0 +1,52 @@ +package com.sekwah.advancedportals.spigot; + +import com.sekwah.advancedportals.core.CoreListeners; +import com.sekwah.advancedportals.core.entities.PortalLocation; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; + +public class Listeners implements Listener { + + private final AdvancedPortalsPlugin plugin; + private final CoreListeners coreListeners; + + public Listeners(AdvancedPortalsPlugin plugin) { + this.plugin = plugin; + this.coreListeners = plugin.getPortalsCore().getCoreListeners(); + } + + @EventHandler + public void onJoinEvent(PlayerJoinEvent event) { + coreListeners.playerJoin(new PlayerContainer(event.getPlayer())); + } + + @EventHandler(priority = EventPriority.HIGH) + public void onBlockPlace(BlockPlaceEvent event) { + if (!event.isCancelled()) { + Location blockloc = event.getBlock().getLocation(); + this.coreListeners.blockPlace(new PlayerContainer(event.getPlayer()), + new PortalLocation(blockloc.getWorld().getName(), blockloc.getBlockX(), blockloc.getBlockY(), blockloc.getBlockZ()), event.getBlockPlaced().getType().toString(), + event.getItemInHand().getType().toString(), event.getItemInHand().getItemMeta().getDisplayName()); + } + } + + @EventHandler + public void onItemInteract(PlayerInteractEvent event) { + if (!event.isCancelled() && (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK) && event.getItem() != null) { + Location blockloc = event.getClickedBlock().getLocation(); + boolean allowEvent = this.coreListeners.playerInteractWithBlock(new PlayerContainer(event.getPlayer()), event.getMaterial().toString(), + event.getItem().getItemMeta().getDisplayName(), + new PortalLocation(blockloc.getWorld().getName(), blockloc.getBlockX(), blockloc.getBlockY(), blockloc.getBlockZ()), + event.getAction() == Action.LEFT_CLICK_BLOCK); + event.setCancelled(!allowEvent); + } + } + +} diff --git a/src/main/java/com/sekwah/advancedportals/spigot/SpigotInfoLogger.java b/src/main/java/com/sekwah/advancedportals/spigot/SpigotInfoLogger.java new file mode 100644 index 0000000..7172077 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/spigot/SpigotInfoLogger.java @@ -0,0 +1,22 @@ +package com.sekwah.advancedportals.spigot; + +import com.sekwah.advancedportals.core.util.InfoLogger; + +public class SpigotInfoLogger extends InfoLogger { + + private final AdvancedPortalsPlugin plugin; + + public SpigotInfoLogger(AdvancedPortalsPlugin plugin) { + this.plugin = plugin; + } + + @Override + public void logWarning(String s) { + plugin.getLogger().warning(s); + } + + @Override + public void log(String s) { + plugin.getLogger().info(s); + } +} diff --git a/src/main/java/com/sekwah/advancedportals/spigot/convertolddata/ConfigAccessor.java b/src/main/java/com/sekwah/advancedportals/spigot/convertolddata/ConfigAccessor.java new file mode 100644 index 0000000..91ae2a9 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/spigot/convertolddata/ConfigAccessor.java @@ -0,0 +1,66 @@ +package com.sekwah.advancedportals.spigot.convertolddata; + +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.logging.Level; + +public class ConfigAccessor { + private final String fileName; + private final JavaPlugin plugin; + + private File configFile; + private FileConfiguration fileConfiguration; + + public ConfigAccessor(JavaPlugin plugin, String fileName) { + this.plugin = plugin; + this.fileName = fileName; + } + + + public void reloadConfig() { + if (configFile == null) { + File dataFolder = plugin.getDataFolder(); + if (dataFolder == null) + throw new IllegalStateException(); + configFile = new File(dataFolder, fileName); + } + fileConfiguration = YamlConfiguration.loadConfiguration(configFile); + + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(new File(this.getClass() + .getClassLoader().getResource(fileName).getPath())); + fileConfiguration.setDefaults(defConfig); + } + + public FileConfiguration getConfig() { + if (fileConfiguration == null) { + this.reloadConfig(); + } + return fileConfiguration; + } + + public void saveConfig() { + if (fileConfiguration == null || configFile == null) { + return; + } else { + try { + getConfig().save(configFile); + } catch (IOException ex) { + plugin.getLogger().log(Level.SEVERE, "Could not save config to " + configFile, ex); + } + } + } + + public void saveDefaultConfig() { + if (configFile == null) { + configFile = new File(plugin.getDataFolder(), fileName); + } + if (!configFile.exists()) { + plugin.saveResource(fileName, false); + } + } + +} diff --git a/src/main/java/com/sekwah/advancedportals/spigot/convertolddata/ConvertOldSubCommand.java b/src/main/java/com/sekwah/advancedportals/spigot/convertolddata/ConvertOldSubCommand.java new file mode 100644 index 0000000..89f9499 --- /dev/null +++ b/src/main/java/com/sekwah/advancedportals/spigot/convertolddata/ConvertOldSubCommand.java @@ -0,0 +1,41 @@ +package com.sekwah.advancedportals.spigot.convertolddata; + +import com.sekwah.advancedportals.core.api.commands.SubCommand; +import com.sekwah.advancedportals.core.util.Lang; +import com.sekwah.advancedportals.coreconnector.container.CommandSenderContainer; + +import java.util.List; + +/** + * TODO this is for spigot only for a few releases + */ +public class ConvertOldSubCommand implements SubCommand { + @Override + public void onCommand(CommandSenderContainer sender, String[] args) { + sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor(" Old portal data found.")); + sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor(" Old portal data successfully converted.")); + sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor(" Old desti data found.")); + sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor(" Old desti data successfully converted.")); + sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor(" Those were just sample outputs, it doesnt work yet.")); + } + + @Override + public boolean hasPermission(CommandSenderContainer sender) { + return sender.isOp(); + } + + @Override + public List onTabComplete(CommandSenderContainer sender, String[] args) { + return null; + } + + @Override + public String getBasicHelpText() { + return null; + } + + @Override + public String getDetailedHelpText() { + return null; + } +} diff --git a/Resources/lang/en_GB.lang b/src/main/resources/lang/en_GB.lang similarity index 100% rename from Resources/lang/en_GB.lang rename to src/main/resources/lang/en_GB.lang diff --git a/src/main/resources/lang/hu_HU.lang b/src/main/resources/lang/hu_HU.lang new file mode 100644 index 0000000..7ea196a --- /dev/null +++ b/src/main/resources/lang/hu_HU.lang @@ -0,0 +1,88 @@ +# Ugyanaz, mint az alapértelmezett minecraft lang fájlok, de kezelheti a megjegyzéseket, ha a # az első karakter +# Bármi, amit a fordítások nem állítottak be, visszaáll az en_GB fájlra. +# Az alapértelmezett en_GB mindig betöltődik bármely más fájl előtt, még akkor is, ha új en_GB-t készít, +# hogy az új karakterláncoknak nincs üres értékei, amelyek esetleg új funkciókat használhatnak fel. +# +# A mellékelt karakterek formátuma %(argumentum száma)$s (kezdődik 1 nem 0) +# Tehát a változók sorrendje a stringbe nem egy sorrend. Csakúgy, mint a minecraft +# +# A színek használata \u00A7 vagy § (az alt megtartásával írható be, majd a számbillentyű lenyomásával 2 majd 1) +# http://minecraft.gamepedia.com/Formatting_codes +# +# Vegye figyelembe, hogy néhány hibaelhárító üzenet itt nem szerepel a fordításban. +# +translatedata.lastchange=1.0.0 +translatedata.translationsoutdated= Néhány fordítás a jelenlegi fordítási fájlból \u00A7e%1$s\u00A7c elavultak. +translatedata.replacecommand= Használat \u00A7e/portal transupdate\u00A7c hogy új alapértelmezést másoljon ki az \u00A7een_GB\u00A7c fájlból. +translatedata.replaced= Az új \u00A7een_GB\u00A7a fájlt másolva az adatmappába. + +messageprefix.positive=\u00A7a[\u00A7eAdvancedPortals\u00A7a] +messageprefix.negative=\u00A7c[\u00A77AdvancedPortals\u00A7c] + +logger.pluginenable=Advanced portals sikeresen engedélyezve! +logger.plugindisable=Advanced portals letiltva! +logger.plugincrafterror=A craftbukkit ezen verziója még nem támogatott, vagy valami hibás, kérlek, írd be ezt az üzenetet a verziószámmal és a fenti stacktrace-szal a GitHub kiadásában v:%1$s + +command.noargs= Sajnálom, de meg kell adni egy al parancsot, kérlek, használd \u00A7e/%1$s help \u00A7cha a lehetséges al parancsok listáját szeretnéd látni. +command.subcommand.invalid= Sajnáljuk, de ez nem érvényes al parancs. + +command.help.header=\u00A7e--------------- \u00A7a%1$s Segítség - Oldal %2$s %3$s\u00A7e-ból/-ből --------------- +command.help.subcommandheader=\u00A7e--------- \u00A7a%1$s Segítség - %2$s\u00A7e --------- +command.help.invalidhelp= Sajnálom, de \u00A7e%1$s\u00A7c nem érvényes oldalszám vagy al parancs. + +command.reload.help=Portál adat újratöltése +command.reload.detailedhelp=Újratölt minden portáladatot az adatmappában található fájlokból +command.reload.reloaded= Minden Advanced Portals adat újratöltve + +command.create.help=Portál létrehozása +command.create.error= Hiba történt a portál létrehozásában: +command.create.console= A konzol segítségével nem hozhat létre portált. +command.create.detailedhelp=A formátum /portal create (név) [tag:tagvalue] Megadja a címkéket a létrehozás után a formátum tag:value, ha az értéknek szóközre van szüksége, használja a formátum tag:"érték a szóközökkel" +command.create.complete= A portál sikeresen létrehozva. + +command.createdesti.help=Célállomások létrehozása +command.createdesti.error= Hiba történt a célállomásnál: +command.createdesti.console= Nem hozhatsz létre célállomást a konzol segítségével. +command.createdesti.detailedhelp=A formátum /desti create (név) [tag:tagvalue] Megadja a címkéket a létrehozás után a formátum tag:calue, ha az értéknek szóközre van szüksége, használja a formátum tag:"érték a szóközökkel" +command.createdesti.complete= A célállomás sikeresen létrehozva. + +command.create.tags=\u00A7aCímkék: + +command.playeronly= Sajnáljuk, de ezt a parancsot csak egy játékos futtathatja. + +command.remove.noname= Meg kell adnod az eltávolítani kívánt portál nevét. +command.remove.error= A portál eltávolítása blokkolt: +command.remove.noname=Nincs ilyen portál ezzel a névvel +command.remove.invalidselection=Az általad választott portál már nem érvényes +command.remove.noselection=Nincs kiválasztott portál +command.remove.complete= A portál sikeresen törölve. + +command.selector= Kaptál egy portálválasztót. +command.selector.help=Ad egy portál régió kiválasztót +command.selector.detailedhelp=Portál választót ad a portálok létrehozásának régiói számára. + +command.portalblock= Kaptál egy \u00A7ePortál blokk\u00A7aot! + +command.endportalblock= Kaptál egy \u00A78Végzet portál blokk helyező\u00A7at! + +command.gatewayblock= Kaptál egy \u00A78Kapubejáró blokk helyező\u00A7at! + +portal.error.invalidselection=A portál létrehozásához mind a pos1, mind a pos2 szükséges. +portal.error.takenname=A portálra megadott név már megtörtént. +portal.error.selection.differentworlds=Mindkét kiválasztott pontnak ugyanabban a világban kell lennie. + +desti.info.noargs=\u00A7cNincsenek címkék megadva + +command.error.noname= Nincs név megadva. + +desti.error.takenname=A portálra megadott név már megtörtént. + +error.notplayer=Csak a játékosok tehetik ezt. + +portal.selector.poschange=\u00A7eKiválasztottad a pos%1$s X:%2$s Y:%3$s Z:%4$s + +command.trans.help=Fordítás másolása fordítás új alapértelmezett fordítási fájl + +command.version.help=Visszaadja a plugin jelenlegi verzióját + +command.subcommand.nopermission= Sajnálom, de erre nincs jogod, kérlek, használd \u00A7e/%1$s help \u00A7cha a lehetséges al parancsok listáját szeretnéd látni. diff --git a/Resources/plugin.yml b/src/main/resources/plugin.yml similarity index 100% rename from Resources/plugin.yml rename to src/main/resources/plugin.yml