From f5acb0300fb273d7ccc72b141e283cb4574e299e Mon Sep 17 00:00:00 2001 From: sekwah41 Date: Wed, 31 Jan 2018 18:06:02 +0000 Subject: [PATCH] Done major work on create command and remove command --- README.md | 3 + Resources/lang/en_GB.lang | 11 +- .../core/AdvancedPortalsCore.java | 6 +- .../advancedportals/core/CoreListeners.java | 30 +++++ .../core/api/managers/PortalManager.java | 115 ++++++++++++++++-- .../core/api/portal/AdvancedPortal.java | 12 +- .../core/api/portal/PortalTagExeption.java | 10 ++ .../core/api/registry/TagRegistry.java | 10 ++ .../core/api/warphandler/TagHandler.java | 26 ++-- .../subcommands/portal/CreateSubCommand.java | 64 +++++++++- .../subcommands/portal/ReloadSubCommand.java | 2 +- .../subcommands/portal/RemoveSubCommand.java | 65 ++++++++++ .../portal/TransUpdateSubCommand.java | 15 ++- .../advancedportals/core/util/Config.java | 4 + 14 files changed, 335 insertions(+), 38 deletions(-) create mode 100644 src/com/sekwah/advancedportals/core/api/portal/PortalTagExeption.java create mode 100644 src/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java diff --git a/README.md b/README.md index 931961ff..228f9e0f 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,9 @@ Advanced Portals diff --git a/Resources/lang/en_GB.lang b/Resources/lang/en_GB.lang index c66b1918..c0f32c84 100644 --- a/Resources/lang/en_GB.lang +++ b/Resources/lang/en_GB.lang @@ -36,9 +36,18 @@ command.reload.reloaded= All Advanced Portals data reloaded command.create.help=Creates portals command.create.noargs= You need to actually list args for portal creation. -command.create.noname= You need to at least give a name to the portal no matter how many other tags you give it. +command.create.error= There was an error making the portal: +command.create.console= You cannot create a portal using the console. command.create.detailedhelp=List tags after create in the format tag:value, if your value needs spaces use the format tag:"value with spaces" +command.remove.noname= You need to give the name of the portal you want to remove. +command.remove.error= Removing the portal was blocked: + +portal.invalidselection=You must have both pos1 and pos2 selected to create a portal. +portal.noname=No name for the portal has been given. +portal.takenname=The name given for the portal is already taken. + +command.trans.help=Copy translation new default translation file command.version.help=Returns the current version of the plugin diff --git a/src/com/sekwah/advancedportals/core/AdvancedPortalsCore.java b/src/com/sekwah/advancedportals/core/AdvancedPortalsCore.java index b8c19a9d..a9a04a1c 100644 --- a/src/com/sekwah/advancedportals/core/AdvancedPortalsCore.java +++ b/src/com/sekwah/advancedportals/core/AdvancedPortalsCore.java @@ -121,7 +121,7 @@ public class AdvancedPortalsCore { this.portalCommand = new CommandWithSubCommands(); this.portalCommand.registerSubCommand("version", new VersionSubCommand()); - this.portalCommand.registerSubCommand("transupdate", new TransUpdateSubCommand()); + this.portalCommand.registerSubCommand("transupdate", new TransUpdateSubCommand(this)); this.portalCommand.registerSubCommand("reload", new ReloadSubCommand(this)); this.commandRegister.registerCommand("portal", this.portalCommand); @@ -156,9 +156,9 @@ public class AdvancedPortalsCore { this.infoLogger.log(Lang.translate("logger.plugindisable")); } - /*public static AdvancedPortalsCore getInstance() { + public static AdvancedPortalsCore getInstance() { return instance; - }*/ + } public Config getConfig() { return this.config; diff --git a/src/com/sekwah/advancedportals/core/CoreListeners.java b/src/com/sekwah/advancedportals/core/CoreListeners.java index a36ece56..2f649a1f 100644 --- a/src/com/sekwah/advancedportals/core/CoreListeners.java +++ b/src/com/sekwah/advancedportals/core/CoreListeners.java @@ -34,6 +34,36 @@ public class CoreListeners { return AdvancedPortalsCore.getPortalManager().playerMove(player, fromLoc, toLoc); } + /** + * + * @param fromPos + * @param toPos + * @return if movement is allowed + */ + public boolean liquidFlow(PortalLocation fromPos, PortalLocation toPos) { + return true; + } + + /** + * @player player causing the event (or null if not a player) + * @param blockPos + * @param blockMaterial + * @return if the block is allowed to break + */ + public boolean blockBreak(PlayerContainer player, PortalLocation blockPos, String blockMaterial) { + return true; + } + + /** + * If the block is allowed to be interacted with e.g. a lever + * @player player causing the event (or null if not a player) + * @param blockPos + * @return + */ + public boolean blockInteract(PlayerContainer player, PortalLocation blockPos) { + return true; + } + /** * * @param player diff --git a/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java b/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java index 85d487b8..39a90195 100644 --- a/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java +++ b/src/com/sekwah/advancedportals/core/api/managers/PortalManager.java @@ -3,13 +3,16 @@ 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.PortalTag; +import com.sekwah.advancedportals.core.api.portal.PortalTagExeption; +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.HashMap; -import java.util.Map; +import java.util.*; /** * When a player leaves the server any data stored on them is removed to free memory. @@ -56,17 +59,28 @@ public class PortalManager { } - /** * Load the default data into the portals. */ public void loadPortals() { - Type type = new TypeToken>(){}.getType(); - this.portalHashMap = this.portalsCore.getDataStorage().loadJson(type ,"portals.json"); - if(this.portalHashMap == null) { + Type type = new TypeToken>() { + }.getType(); + this.portalHashMap = this.portalsCore.getDataStorage().loadJson(type, "portals.json"); + if (this.portalHashMap == null) { this.portalHashMap = new HashMap<>(); } this.portalsCore.getDataStorage().storeJson(this.portalHashMap, "config.json"); + this.updatePortalArray(); + } + + public boolean removePortal(String portalName) { + if (this.portalHashMap.containsKey(portalName)) { + this.portalHashMap.remove(portalName); + this.updatePortalArray(); + return true; + } else { + return false; + } } public void playerJoin(PlayerContainer player) { @@ -80,4 +94,91 @@ public class PortalManager { public boolean playerMove(PlayerContainer player, PlayerLocation fromLoc, PlayerLocation toLoc) { return false; } -} + + public void createPortal(PlayerContainer player, ArrayList tags) throws PortalTagExeption { + if (this.portalSelectorLeftClick.containsKey(player.getUUID().toString()) + && this.portalSelectorRightClick.containsKey(player.getUUID().toString())) { + this.createPortal(player, this.portalSelectorLeftClick.get(player.getUUID().toString()), + this.portalSelectorRightClick.get(player.getUUID().toString()), tags); + } else { + throw new PortalTagExeption(Lang.translate("portal.invalidselection")); + } + } + + /** + * + * @param loc1 + * @param loc2 + * @param tags + * @return + * @throws PortalTagExeption + */ + public boolean createPortal(PortalLocation loc1, PortalLocation loc2, ArrayList tags) throws PortalTagExeption { + return createPortal(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 + * @return + * @throws PortalTagExeption + */ + public boolean createPortal(PlayerContainer player, PortalLocation loc1, PortalLocation loc2, ArrayList tags) throws PortalTagExeption { + 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); + + PortalLocation maxLoc = new PortalLocation(maxX, maxY, maxZ); + PortalLocation minLoc = new PortalLocation(minX, minY, minZ); + + AdvancedPortal portal = new AdvancedPortal(maxLoc, minLoc); + for(PortalTag portalTag : tags) { + portal.setArg(portalTag); + } + for(PortalTag portalTag : tags) { + TagHandler.Creation creation = AdvancedPortalsCore.getTagRegistry().getCreationHandler(portalTag.NAME); + creation.portalCreated(portal, player, portalTag.VALUE); + } + String portalName = portal.getArg("name"); + if(portalName == null || portalName.equals("")) { + throw new PortalTagExeption(Lang.translate("portal.noname")); + } + else if(this.portalHashMap.containsKey(portalName)) { + throw new PortalTagExeption(Lang.translate("portal.takenname")); + } + portal.removeArg("name"); + this.portalHashMap.put(portalName, portal); + this.updatePortalArray(); + return true; + } + + private void updatePortalArray() { + Collection portalValues = this.portalHashMap.values(); + this.portals = portalValues.toArray(new AdvancedPortal[0]); + } + + public void removePlayerSelection(PlayerContainer player) throws PortalTagExeption { + + } + + public void removePortal(PlayerContainer player, String portalName) throws PortalTagExeption { + + } + + /** + * Get an array of portals without a reference to the main array + * @return + */ + public Set> getPortals() { + return this.portalHashMap.entrySet(); + } +} \ No newline at end of file diff --git a/src/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java b/src/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java index a9b6650b..9b6b3d4f 100644 --- a/src/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java +++ b/src/com/sekwah/advancedportals/core/api/portal/AdvancedPortal.java @@ -20,6 +20,8 @@ public class AdvancedPortal { private PortalLocation minLoc; + private String triggerBlock; + private HashMap args = new HashMap<>(); private transient Set argsCol; @@ -64,16 +66,20 @@ public class AdvancedPortal { } for(PortalTag portalTag : portalTags) { TagHandler.Activation activationHandler = tagRegistry.getActivationHandler(portalTag.NAME); - activationHandler.portalPreActivated(player, data, this.getArg(portalTag.NAME)); + activationHandler.portalPreActivated(this, player, data, this.getArg(portalTag.NAME)); } for(PortalTag portalTag : portalTags) { TagHandler.Activation activationHandler = tagRegistry.getActivationHandler(portalTag.NAME); - activationHandler.portalActivated(player, data, this.getArg(portalTag.NAME)); + activationHandler.portalActivated(this, player, data, this.getArg(portalTag.NAME)); } for(PortalTag portalTag : portalTags) { TagHandler.Activation activationHandler = tagRegistry.getActivationHandler(portalTag.NAME); - activationHandler.portalPostActivated(player, data, this.getArg(portalTag.NAME)); + activationHandler.portalPostActivated(this, player, data, this.getArg(portalTag.NAME)); } return true; } + + public void setArg(PortalTag portalTag) { + this.setArg(portalTag.NAME, portalTag.VALUE); + } } diff --git a/src/com/sekwah/advancedportals/core/api/portal/PortalTagExeption.java b/src/com/sekwah/advancedportals/core/api/portal/PortalTagExeption.java new file mode 100644 index 00000000..6cfade8c --- /dev/null +++ b/src/com/sekwah/advancedportals/core/api/portal/PortalTagExeption.java @@ -0,0 +1,10 @@ +package com.sekwah.advancedportals.core.api.portal; + +/** + * Returns a message saying what went wrong with the portal tag. + */ +public class PortalTagExeption extends Exception { + public PortalTagExeption(String reason) { + super(reason); + } +} diff --git a/src/com/sekwah/advancedportals/core/api/registry/TagRegistry.java b/src/com/sekwah/advancedportals/core/api/registry/TagRegistry.java index c9153c25..00cd2b3f 100644 --- a/src/com/sekwah/advancedportals/core/api/registry/TagRegistry.java +++ b/src/com/sekwah/advancedportals/core/api/registry/TagRegistry.java @@ -108,6 +108,16 @@ public class TagRegistry { return false; } + /** + * Returns a non referenced copy of the array list. + * @return + */ + public ArrayList getTags() { + ArrayList newArrayList = new ArrayList<>(); + newArrayList.addAll(this.tags); + return newArrayList; + } + public boolean isTagRegistered(String tag){ return this.tagDesc.containsKey(tag); } diff --git a/src/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java b/src/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java index 3be1c9e0..dfde43f2 100644 --- a/src/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java +++ b/src/com/sekwah/advancedportals/core/api/warphandler/TagHandler.java @@ -1,5 +1,7 @@ package com.sekwah.advancedportals.core.api.warphandler; +import com.sekwah.advancedportals.core.api.portal.AdvancedPortal; +import com.sekwah.advancedportals.core.api.portal.PortalTagExeption; import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; /** @@ -28,21 +30,21 @@ public class TagHandler { * Example if the player does not have access to use a tag on the portal. * * @param player if null the portal has been created by the server or a plugin - * @param activeData * @param argData * @return if the portal can be created. + * @throws PortalTagExeption message given is the reason the portal cant be made */ - boolean portalCreated(PlayerContainer player, ActivationData activeData, String argData); + void portalCreated(AdvancedPortal portal, PlayerContainer player, String argData) throws PortalTagExeption; /** * Example if the player does not have access to remove the portal. * * @param player if null the portal has been destroyed by the server or a plugin - * @param activeData * @param argData * @return if the portal can be destroyed. + * @throws PortalTagExeption message given is the reason the portal cant be removed */ - boolean portalDestroyed(PlayerContainer player, ActivationData activeData, String argData); + void portalDestroyed(AdvancedPortal portal, PlayerContainer player, String argData) throws PortalTagExeption; } @@ -55,7 +57,7 @@ public class TagHandler { * @param activeData * @param argData */ - void portalPreActivated(PlayerContainer player, ActivationData activeData, String argData); + void portalPreActivated(AdvancedPortal portal, PlayerContainer player, ActivationData activeData, String argData); /** * Activates after portal activation @@ -64,7 +66,7 @@ public class TagHandler { * @param activeData * @param argData */ - void portalPostActivated(PlayerContainer player, ActivationData activeData, String argData); + void portalPostActivated(AdvancedPortal portal, PlayerContainer player, ActivationData activeData, String argData); /** * Activates if the portal is allowed from pre @@ -73,31 +75,29 @@ public class TagHandler { * @param activeData * @param argData */ - void portalActivated(PlayerContainer player, ActivationData activeData, String argData); + void portalActivated(AdvancedPortal portal, PlayerContainer player, ActivationData activeData, String argData); } public interface TagStatus { /** - * If the user has access to add the tag + * If the user has access to add the tag (this does not include being added on creation) * * @param player - * @param activeData * @param argData * @return if the tag will be added. */ - boolean tagAdded(PlayerContainer player, ActivationData activeData, String argData); + boolean tagAdded(AdvancedPortal portal, PlayerContainer player, String argData); /** - * If the user has access to remove the tag + * If the user has access to remove the tag (this does not include being added on destruction) * * @param player - * @param activeData * @param argData * @return if the tag will be removed. */ - boolean tagRemoved(PlayerContainer player, ActivationData activeData, String argData); + boolean tagRemoved(AdvancedPortal portal, PlayerContainer player, String argData); } diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/CreateSubCommand.java b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/CreateSubCommand.java index 97a6662a..e1469f74 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/CreateSubCommand.java +++ b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/CreateSubCommand.java @@ -1,28 +1,80 @@ 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.PortalTag; +import com.sekwah.advancedportals.core.api.portal.PortalTagExeption; import com.sekwah.advancedportals.core.util.Lang; import com.sekwah.advancedportals.coreconnector.container.CommandSenderContainer; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; +import java.util.ArrayList; import java.util.List; public class CreateSubCommand implements SubCommand { + @Override public void onCommand(CommandSenderContainer sender, String[] args) { if(args.length > 1) { - //AdvancedPortal newPortal = new AdvancedPortal(); - - + PlayerContainer player = sender.getPlayerContainer(); + if(player == null) { + sender.sendMessage(Lang.translateColor("messageprefix.negative") + Lang.translate("command.create.console")); + return; + } + ArrayList portalTags = new ArrayList<>(); + boolean partingValueWithSpaces = false; + String argBeingParsed = ""; + String currentParsedValue = ""; + for (int i = 1; i < args.length; i++) { + if(partingValueWithSpaces) { + if(args[i].charAt(args[i].length() - 1) == '"') { + args[i] = args[i].substring(0, args[i].length() - 1); + partingValueWithSpaces = false; + portalTags.add(new PortalTag(argBeingParsed, currentParsedValue)); + } + else { + currentParsedValue += " " + args[i]; + } + } + else { + String detectedTag = this.getTag(args[i].toLowerCase()); + if(args[i].toLowerCase().startsWith(detectedTag + ":")) { + String arg = args[i].substring(detectedTag.length()); + if(arg.length() > 0 && arg.charAt(0) == '"') { + argBeingParsed = detectedTag; + currentParsedValue = arg; + } + else { + portalTags.add(new PortalTag(detectedTag, arg)); + } + } + } + } + try { + AdvancedPortalsCore.getPortalManager().createPortal(player, portalTags); + } catch (PortalTagExeption portalTagExeption) { + sender.sendMessage(Lang.translateColor("messageprefix.negative") + Lang.translateColor("command.create.error") + " " + + portalTagExeption.getMessage()); + } } else { - sender.sendMessage(Lang.translate("")); + sender.sendMessage(Lang.translate("command.create.noargs")); } } + private String getTag(String arg) { + ArrayList tags = AdvancedPortalsCore.getTagRegistry().getTags(); + for(String tag : tags) { + if(arg.startsWith(tag + ":")) { + return tag; + } + } + return null; + } + @Override public boolean hasPermission(CommandSenderContainer sender) { - return sender.isOp(); + return sender.isOp() || sender.hasPermission("advancedportals.createportal"); } @Override diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java index df2f59bd..566a85d3 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java +++ b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/ReloadSubCommand.java @@ -25,7 +25,7 @@ public class ReloadSubCommand implements SubCommand { @Override public boolean hasPermission(CommandSenderContainer sender) { - return sender.isOp(); + return sender.isOp() || sender.hasPermission("advancedportals.reload"); } @Override diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java new file mode 100644 index 00000000..2fed5754 --- /dev/null +++ b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/RemoveSubCommand.java @@ -0,0 +1,65 @@ +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.PortalTag; +import com.sekwah.advancedportals.core.api.portal.PortalTagExeption; +import com.sekwah.advancedportals.core.util.Lang; +import com.sekwah.advancedportals.coreconnector.container.CommandSenderContainer; +import com.sekwah.advancedportals.coreconnector.container.PlayerContainer; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class RemoveSubCommand implements SubCommand { + + @Override + public void onCommand(CommandSenderContainer sender, String[] args) { + if(args.length > 1) { + + + } + else { + PlayerContainer player = sender.getPlayerContainer(); + if(player == null) { + sender.sendMessage(Lang.translate("command.remove.noname")); + } + else { + try { + AdvancedPortalsCore.getPortalManager().removePlayerSelection(player); + } catch (PortalTagExeption portalTagExeption) { + sender.sendMessage(Lang.translateColor("messageprefix.negative") + + Lang.translateColor("command.remove.error") + " " + portalTagExeption.getMessage()); + } + } + } + } + + @Override + public boolean hasPermission(CommandSenderContainer sender) { + return sender.isOp() || sender.hasPermission("advancedportals.createportal"); + } + + @Override + public List onTabComplete(CommandSenderContainer sender, String[] args) { + List portalNames = new ArrayList<>(); + for(Map.Entry portal : AdvancedPortalsCore.getPortalManager().getPortals()) { + portalNames.add(portal.getKey()); + } + Collections.sort(portalNames); + return portalNames; + } + + @Override + public String getBasicHelpText() { + return Lang.translate("command.create.help"); + } + + @Override + public String getDetailedHelpText() { + return Lang.translate("command.create.detailedhelp"); + } +} diff --git a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java index f45f54bb..4ba99fcb 100644 --- a/src/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java +++ b/src/com/sekwah/advancedportals/core/commands/subcommands/portal/TransUpdateSubCommand.java @@ -8,15 +8,22 @@ import com.sekwah.advancedportals.coreconnector.container.CommandSenderContainer import java.util.List; public class TransUpdateSubCommand implements SubCommand { + + private final AdvancedPortalsCore portalsCore; + + public TransUpdateSubCommand(AdvancedPortalsCore portalsCore) { + this.portalsCore = portalsCore; + } + @Override public void onCommand(CommandSenderContainer sender, String[] args) { - AdvancedPortalsCore.getInstance().getDataStorage().copyDefaultFile("lang/en_GB.lang", true); + this.portalsCore.getDataStorage().copyDefaultFile("lang/en_GB.lang", true); sender.sendMessage(Lang.translateColor("messageprefix.positive") + Lang.translateColor("translatedata.replaced")); } @Override public boolean hasPermission(CommandSenderContainer sender) { - return sender.isOp(); + return sender.isOp() || sender.hasPermission("advancedportals.transupdate"); } @Override @@ -26,11 +33,11 @@ public class TransUpdateSubCommand implements SubCommand { @Override public String getBasicHelpText() { - return "This is basic help text"; + return Lang.translate("command.trans.help"); } @Override public String getDetailedHelpText() { - return "This help text is a lot more detailed than the basic one"; + return Lang.translate("command.trans.help"); } } diff --git a/src/com/sekwah/advancedportals/core/util/Config.java b/src/com/sekwah/advancedportals/core/util/Config.java index 5c5a5163..f62f9481 100644 --- a/src/com/sekwah/advancedportals/core/util/Config.java +++ b/src/com/sekwah/advancedportals/core/util/Config.java @@ -19,6 +19,10 @@ public class Config { 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";