Adds an option for setting the exit velocity of a teleporting player
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	EpicKnarvik97/Stargate/pipeline/head There was a failure building this commit
				
			This commit is contained in:
		@@ -90,6 +90,15 @@ public class CommandConfig implements CommandExecutor {
 | 
			
		||||
                    configuration.set(selectedOption.getConfigNode(), intValue);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            case DOUBLE -> {
 | 
			
		||||
                Double doubleValue = getDouble(commandSender, selectedOption, value);
 | 
			
		||||
                if (doubleValue == null) {
 | 
			
		||||
                    return;
 | 
			
		||||
                } else {
 | 
			
		||||
                    Stargate.getStargateConfig().getConfigOptionsReference().put(selectedOption, doubleValue);
 | 
			
		||||
                    configuration.set(selectedOption.getConfigNode(), doubleValue);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            case STRING -> {
 | 
			
		||||
                updateStringConfigValue(selectedOption, commandSender, value);
 | 
			
		||||
                configuration.set(selectedOption.getConfigNode(), value);
 | 
			
		||||
@@ -314,6 +323,30 @@ public class CommandConfig implements CommandExecutor {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a double from a string
 | 
			
		||||
     *
 | 
			
		||||
     * @param commandSender  <p>The command sender that sent the config command</p>
 | 
			
		||||
     * @param selectedOption <p>The option the command sender is trying to change</p>
 | 
			
		||||
     * @param value          <p>The value given</p>
 | 
			
		||||
     * @return <p>A double, or null if it was invalid</p>
 | 
			
		||||
     */
 | 
			
		||||
    private Double getDouble(CommandSender commandSender, ConfigOption selectedOption, String value) {
 | 
			
		||||
        try {
 | 
			
		||||
            double doubleValue = Double.parseDouble(value);
 | 
			
		||||
 | 
			
		||||
            if (selectedOption == ConfigOption.EXIT_VELOCITY && doubleValue < 0) {
 | 
			
		||||
                commandSender.sendMessage(ChatColor.RED + "This config option cannot be negative.");
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return doubleValue;
 | 
			
		||||
        } catch (NumberFormatException exception) {
 | 
			
		||||
            commandSender.sendMessage(ChatColor.RED + "Invalid number given");
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Reloads the config if necessary
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -21,16 +21,17 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
 | 
			
		||||
    private List<String> signTypes;
 | 
			
		||||
    private List<String> booleans;
 | 
			
		||||
    private List<String> numbers;
 | 
			
		||||
    private List<String> integers;
 | 
			
		||||
    private List<String> chatColors;
 | 
			
		||||
    private List<String> languages;
 | 
			
		||||
    private List<String> extendedColors;
 | 
			
		||||
    private List<String> doubles;
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<String> onTabComplete(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s,
 | 
			
		||||
                                      @NotNull String[] args) {
 | 
			
		||||
        if (signTypes == null || booleans == null || numbers == null || chatColors == null || languages == null) {
 | 
			
		||||
        if (signTypes == null || booleans == null || integers == null || chatColors == null || languages == null) {
 | 
			
		||||
            initializeAutoCompleteLists();
 | 
			
		||||
        }
 | 
			
		||||
        if (args.length > 1) {
 | 
			
		||||
@@ -104,7 +105,16 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
        //If the config value is an integer, display some valid numbers
 | 
			
		||||
        if (selectedOption.getDataType() == OptionDataType.INTEGER) {
 | 
			
		||||
            if (typedText.trim().isEmpty()) {
 | 
			
		||||
                return numbers;
 | 
			
		||||
                return integers;
 | 
			
		||||
            } else {
 | 
			
		||||
                return new ArrayList<>();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //If the config value is a double, display some valid numbers
 | 
			
		||||
        if (selectedOption.getDataType() == OptionDataType.DOUBLE) {
 | 
			
		||||
            if (typedText.trim().isEmpty()) {
 | 
			
		||||
                return doubles;
 | 
			
		||||
            } else {
 | 
			
		||||
                return new ArrayList<>();
 | 
			
		||||
            }
 | 
			
		||||
@@ -164,9 +174,9 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
        booleans.add("true");
 | 
			
		||||
        booleans.add("false");
 | 
			
		||||
 | 
			
		||||
        numbers = new ArrayList<>();
 | 
			
		||||
        numbers.add("0");
 | 
			
		||||
        numbers.add("5");
 | 
			
		||||
        integers = new ArrayList<>();
 | 
			
		||||
        integers.add("0");
 | 
			
		||||
        integers.add("5");
 | 
			
		||||
 | 
			
		||||
        signTypes = new ArrayList<>();
 | 
			
		||||
        for (Material material : Material.values()) {
 | 
			
		||||
@@ -181,6 +191,12 @@ public class ConfigTabCompleter implements TabCompleter {
 | 
			
		||||
        extendedColors = new ArrayList<>(chatColors);
 | 
			
		||||
        extendedColors.add("default");
 | 
			
		||||
        extendedColors.add("inverted");
 | 
			
		||||
 | 
			
		||||
        doubles = new ArrayList<>();
 | 
			
		||||
        doubles.add("5");
 | 
			
		||||
        doubles.add("1");
 | 
			
		||||
        doubles.add("0.5");
 | 
			
		||||
        doubles.add("0.1");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -156,8 +156,12 @@ public enum ConfigOption {
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether to alert admins about new updates
 | 
			
		||||
     */
 | 
			
		||||
    ADMIN_UPDATE_ALERT("adminUpdateAlert", "Whether to alert admins about new plugin updates", true);
 | 
			
		||||
    ADMIN_UPDATE_ALERT("adminUpdateAlert", "Whether to alert admins about new plugin updates", true),
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The velocity of players exiting a stargate, relative to the entry velocity
 | 
			
		||||
     */
 | 
			
		||||
    EXIT_VELOCITY("gates.exitVelocity", "The velocity of players exiting stargates, relative to the entry velocity", 0.1D);
 | 
			
		||||
 | 
			
		||||
    private final String configNode;
 | 
			
		||||
    private final String description;
 | 
			
		||||
@@ -184,6 +188,8 @@ public enum ConfigOption {
 | 
			
		||||
            this.dataType = OptionDataType.BOOLEAN;
 | 
			
		||||
        } else if (defaultValue instanceof Integer) {
 | 
			
		||||
            this.dataType = OptionDataType.INTEGER;
 | 
			
		||||
        } else if (defaultValue instanceof Double) {
 | 
			
		||||
            this.dataType = OptionDataType.DOUBLE;
 | 
			
		||||
        } else {
 | 
			
		||||
            throw new IllegalArgumentException("Unknown config data type encountered: " + defaultValue);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,17 +6,28 @@ package net.knarcraft.stargate.config;
 | 
			
		||||
public enum OptionDataType {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The data type for the option is a String
 | 
			
		||||
     * The data type if the option is a String
 | 
			
		||||
     */
 | 
			
		||||
    STRING,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The data type for the option is a Boolean
 | 
			
		||||
     * The data type if the option is a Boolean
 | 
			
		||||
     */
 | 
			
		||||
    BOOLEAN,
 | 
			
		||||
    STRING_LIST,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The data type for the option is an Integer
 | 
			
		||||
     * The data type if the option is a string list
 | 
			
		||||
     */
 | 
			
		||||
    INTEGER
 | 
			
		||||
    STRING_LIST,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The data type if the option is an Integer
 | 
			
		||||
     */
 | 
			
		||||
    INTEGER,
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The data type if the option is a double
 | 
			
		||||
     */
 | 
			
		||||
    DOUBLE
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -358,6 +358,7 @@ public final class StargateConfig {
 | 
			
		||||
                }
 | 
			
		||||
                case BOOLEAN -> optionValue = newConfig.getBoolean(configNode);
 | 
			
		||||
                case INTEGER -> optionValue = newConfig.getInt(configNode);
 | 
			
		||||
                case DOUBLE -> optionValue = newConfig.getDouble(configNode);
 | 
			
		||||
                default -> throw new IllegalArgumentException("Invalid config data type encountered");
 | 
			
		||||
            }
 | 
			
		||||
            configOptions.put(option, optionValue);
 | 
			
		||||
 
 | 
			
		||||
@@ -179,6 +179,15 @@ public final class StargateGateConfig {
 | 
			
		||||
        return (String) configOptions.get(ConfigOption.DEFAULT_GATE_NETWORK);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the exit velocity of players using stargates, relative to the entry velocity
 | 
			
		||||
     *
 | 
			
		||||
     * @return <p>The relative exit velocity</p>
 | 
			
		||||
     */
 | 
			
		||||
    public double getExitVelocity() {
 | 
			
		||||
        return (double) configOptions.get(ConfigOption.EXIT_VELOCITY);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Loads all config values related to gates
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,12 @@ package net.knarcraft.stargate.portal.teleporter;
 | 
			
		||||
import net.knarcraft.stargate.Stargate;
 | 
			
		||||
import net.knarcraft.stargate.event.StargatePlayerPortalEvent;
 | 
			
		||||
import net.knarcraft.stargate.portal.Portal;
 | 
			
		||||
import net.knarcraft.stargate.utility.DirectionHelper;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.Location;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.bukkit.event.player.PlayerMoveEvent;
 | 
			
		||||
import org.bukkit.util.Vector;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The portal teleporter takes care of the actual portal teleportation for any players
 | 
			
		||||
@@ -32,6 +35,7 @@ public class PlayerTeleporter extends Teleporter {
 | 
			
		||||
     * @param event  <p>The player move event triggering the event</p>
 | 
			
		||||
     */
 | 
			
		||||
    public void teleport(Portal origin, PlayerMoveEvent event) {
 | 
			
		||||
        double velocity = player.getVelocity().length();
 | 
			
		||||
        Location traveller = player.getLocation();
 | 
			
		||||
        Location exit = getExit(player, traveller);
 | 
			
		||||
 | 
			
		||||
@@ -56,9 +60,16 @@ public class PlayerTeleporter extends Teleporter {
 | 
			
		||||
        if (event == null) {
 | 
			
		||||
            player.teleport(exit);
 | 
			
		||||
        } else {
 | 
			
		||||
            //The new method to teleport in a move event is set the "to" field.
 | 
			
		||||
            //Set the exit location of the event
 | 
			
		||||
            event.setTo(exit);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //Set the velocity of the teleported player after the teleportation is finished
 | 
			
		||||
        Bukkit.getScheduler().scheduleSyncDelayedTask(Stargate.getInstance(), () -> {
 | 
			
		||||
            Vector newVelocityDirection = DirectionHelper.getDirectionVectorFromYaw(portal.getYaw());
 | 
			
		||||
            Vector newVelocity = newVelocityDirection.multiply(velocity * Stargate.getGateConfig().getExitVelocity());
 | 
			
		||||
            player.setVelocity(newVelocity);
 | 
			
		||||
        }, 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,8 @@ gates:
 | 
			
		||||
  maxGatesEachNetwork: 0
 | 
			
		||||
  # defaultGateNetwork - The default gate network
 | 
			
		||||
  defaultGateNetwork: central
 | 
			
		||||
  # exitVelocity - The velocity of players exiting stargates, relative to the entry velocity
 | 
			
		||||
  exitVelocity: 0.1
 | 
			
		||||
  cosmetic:
 | 
			
		||||
    # rememberDestination - Whether to remember the cursor location between uses
 | 
			
		||||
    rememberDestination: false
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user