Skip to content

Commit

Permalink
1.6.0:
Browse files Browse the repository at this point in the history
- Disable Towny version checker.
- New Config Option: flight_Disable_Timer
  - Default: 3
  - Number of seconds after leaving an allowed-flight area before flight
is removed, giving players a chance to re-enter their town.
  - Closes #22
  - Also handles moving between two allied towns.
  - Closes #30
- Fix taking flight off of people in Spectator/Creative gamemodes.
  - Closes #31
  • Loading branch information
LlmDl committed May 20, 2020
1 parent 2dd6128 commit 0b1adef
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 59 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.gmail.llmdlio</groupId>
<artifactId>TownyFlight</artifactId>
<version>1.5.8</version>
<version>1.6.0</version>
<name>TownyFlight</name>
<description>A flight plugin for Towny servers.</description>
<properties>
Expand Down
74 changes: 24 additions & 50 deletions src/main/java/com/gmail/llmdlio/townyflight/TownyFlight.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.gmail.llmdlio.townyflight;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.bukkit.Bukkit;
Expand Down Expand Up @@ -29,12 +28,13 @@
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.utils.CombatUtil;

public class TownyFlight extends JavaPlugin {

private final PlayerEnterTownListener playerEnterListener = new PlayerEnterTownListener(this);
private final PlayerJoinListener playerJoinListener = new PlayerJoinListener(this);
private final PlayerLeaveTownListener playerLeaveListener = new PlayerLeaveTownListener();
private final PlayerLeaveTownListener playerLeaveListener = new PlayerLeaveTownListener(this);
private final PlayerPVPListener playerPVPListener = new PlayerPVPListener();
private final TownUnclaimListener townUnclaimListener = new TownUnclaimListener();
private final PlayerFallListener playerFallListener = new PlayerFallListener();
Expand All @@ -49,13 +49,15 @@ public class TownyFlight extends JavaPlugin {
private static String flightDeactivatedConsoleMsg;
private static String noPermission;
private static String notDuringWar;
public static String returnToAllowedArea;

public static Boolean autoEnableFlight;
public static Boolean autoEnableSilent;
public static Boolean disableCombatPrevention;
private static Boolean disableDuringWar;
private static Boolean showPermissionInMessage;
private static Boolean warsForTownyFound = false;
public static int flightDisableTimer;

public static List<Player> flyingPlayers = new ArrayList<>();

Expand All @@ -67,7 +69,7 @@ public void onEnable() {
plugin = this;
reloadConfig();

if (!LoadSettings()) {
if (!loadSettings()) {
getLogger().severe("Config failed to load!");
this.getServer().getPluginManager().disablePlugin(this);
return;
Expand All @@ -90,36 +92,8 @@ public void onEnable() {
}

private boolean townyVersionCheck(String version) {
// Towny 0.94.0.2+ required.
if (getServer().getPluginManager().getPlugin("Towny").isEnabled()) {
String[] versionShortened = version.split(" ");
int[] vers = Arrays.stream(versionShortened[0].split("\\.")).mapToInt(Integer::parseInt).toArray();

if (Integer.valueOf(vers[1]) < 94) {
getLogger().severe("Towny version inadequate: 0.94.0.2 or newer required.");
return false;
}
if (Integer.valueOf(vers[1]) > 94) {
return true;
}
// Must be on a version of 0.94.*.*
if (vers[2] > 0) {
return true;
}
// Must be on a version of 0.94.0.*
if (vers[3] == 1) {
getLogger().severe("Towny version 0.94.0.1 has a broken API. Download Towny 0.94.0.2 or newer.");
return false;
}
if (vers[3] > 1 ) {
return true;
}

} else {
getLogger().severe("Towny version inadequate: 0.94.0.2 or newer required.");
return false;
}
return false;
// This was not terrible useful or well-made so for now we are disabling the version checking.
return true;
}

public void onDisable() {
Expand All @@ -132,7 +106,7 @@ public void reloadConfig() {
config.reload();
}

private boolean LoadSettings() {
private boolean loadSettings() {
pluginPrefix = ChatColor.translateAlternateColorCodes('&', config.getConfig().getString("pluginPrefix"));

// Language Strings
Expand All @@ -145,13 +119,15 @@ private boolean LoadSettings() {
flightDeactivatedConsoleMsg = ChatColor.translateAlternateColorCodes('&', config.getConfig().getConfigurationSection("language").getString("flightDeactivatedConsoleMsg"));
noPermission = ChatColor.translateAlternateColorCodes('&', config.getConfig().getConfigurationSection("language").getString("noPermission"));
notDuringWar = ChatColor.translateAlternateColorCodes('&', config.getConfig().getConfigurationSection("language").getString("notDuringWar"));
returnToAllowedArea = ChatColor.translateAlternateColorCodes('&', config.getConfig().getConfigurationSection("language").getString("returnToAllowedArea"));

// Options
autoEnableFlight = config.getConfig().getConfigurationSection("options").getString("auto_Enable_Flight").equalsIgnoreCase("true");
autoEnableSilent = config.getConfig().getConfigurationSection("options").getString("auto_Enable_Silent").equalsIgnoreCase("true");
disableDuringWar = config.getConfig().getConfigurationSection("options").getString("disable_During_Wartime").equalsIgnoreCase("true");
disableCombatPrevention = config.getConfig().getConfigurationSection("options").getString("disable_Combat_Prevention").equalsIgnoreCase("true");
showPermissionInMessage = config.getConfig().getConfigurationSection("options").getString("show_Permission_After_No_Permission_Message").equalsIgnoreCase("true");
showPermissionInMessage = config.getConfig().getConfigurationSection("options").getString("show_Permission_After_No_Permission_Message").equalsIgnoreCase("true");
flightDisableTimer = Integer.valueOf(config.getConfig().getConfigurationSection("options").getString("flight_Disable_Timer"));

return true;
}
Expand All @@ -176,7 +152,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St

if (args[0].equalsIgnoreCase("reload")) {
config.reload();
LoadSettings();
loadSettings();
registerEvents();
sender.sendMessage(pluginPrefix + "Config.yml reloaded.");
return true;
Expand Down Expand Up @@ -207,7 +183,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return true;
}
config.reload();
LoadSettings();
loadSettings();
registerEvents();
sender.sendMessage(pluginPrefix + "Config.yml reloaded");
return true;
Expand Down Expand Up @@ -251,7 +227,7 @@ public static boolean canFly(Player player, boolean silent) {
if (!silent) player.sendMessage(pluginPrefix + noTownMsg);
return false;
}
if (!allowedLocation(player, resident)) {
if (!allowedLocation(player)) {
if (!silent) player.sendMessage(pluginPrefix + notInTownMsg);
return false;
}
Expand Down Expand Up @@ -280,10 +256,14 @@ private static boolean warsForTowny(Resident resident) {
* whether they have the alliedtowns permission and if they are in an allied area.
*
* @param player
* @param resident
* @return
* @return true if player is allowed to be flying at their present location.
*/
private static boolean allowedLocation(Player player, Resident resident) {
private static boolean allowedLocation(Player player) {
Resident resident = null;
try {
resident = TownyAPI.getInstance().getDataSource().getResident(player.getName());
} catch (NotRegisteredException ignored) {
}
if (TownyAPI.getInstance().isWilderness(player.getLocation()))
return false;

Expand All @@ -292,18 +272,12 @@ private static boolean allowedLocation(Player player, Resident resident) {

try {
Town town = TownyAPI.getInstance().getTownBlock(player.getLocation()).getTown();
if (!resident.getTown().equals(town)) {
if (player.hasPermission("townyflight.alliedtowns") && resident.getTown().hasNation()) {
if (resident.getTown().getNation().hasTown(town)) return true;
else if (town.hasNation())
if (town.getNation().hasAlly(resident.getTown().getNation())) return true;
}
return false;
}
if (player.hasPermission("townyflight.alliedtowns"))
return CombatUtil.isAlly(town, resident.getTown());
} catch (NotRegisteredException e) {
e.printStackTrace();
}
return true;
return false;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ private void loadConfig(){
addDefault("language.noPermission", "You do not have permission for this command, missing: ");
addComment("language.notDuringWar", "# Message shown when war is active and flight is disallowed.");
addDefault("language.notDuringWar", "You cannot use flight while Towny war is active. ");
addComment("language.returnToAllowedArea", "# Message telling a player to return to an allowed flight area.");
addDefault("language.returnToAllowedArea", "You have %s seconds to return to an allowed flight area. ");


addComment("options", "", "",
"#################",
Expand All @@ -90,6 +93,9 @@ private void loadConfig(){
addDefault("options.disable_Combat_Prevention","false");
addComment("options.show_Permission_After_No_Permission_Message","# If set to false, the language.noPermission message will not display the permission node.");
addDefault("options.show_Permission_After_No_Permission_Message","true");
addComment("options.flight_Disable_Timer","# Number of seconds after leaving an allowed flight area before flight is taken away.","# Set to 0 to take flight away immediately.");
addDefault("options.flight_Disable_Timer","3");

// Write back config
try {
config.save(f);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,16 @@ public PlayerEnterTownListener(TownyFlight instance) {
@EventHandler(priority = EventPriority.LOWEST)
private void playerEnterTownEvent (PlayerEnterTownEvent event) {
final Player player = event.getPlayer();
if (player.hasPermission("townyflight.bypass")) // Added in 1.2.5 to stop players with the bypass node from losing flight when entering a town.
// Do nothing to players who are already flying.
if (player.getAllowFlight())
return;
plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() {
plugin.getServer().getScheduler().runTask(plugin, new Runnable() {
public void run() {
if (!TownyFlight.canFly(player, true))
return;
TownyFlight.toggleFlight(player, TownyFlight.autoEnableSilent, false, "");
};
},20);
});

}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,59 @@
package com.gmail.llmdlio.townyflight.listeners;

import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitRunnable;

import com.gmail.llmdlio.townyflight.TownyFlight;
import com.palmergames.bukkit.towny.event.PlayerLeaveTownEvent;

public class PlayerLeaveTownListener implements Listener{

public PlayerLeaveTownListener() {
private final TownyFlight plugin;

public PlayerLeaveTownListener(TownyFlight instance) {
plugin = instance;
}

/*
* Listener for a player who leaves town.
* If they are flying, flying is deactivated.
* Runs one tick after the PlayerLeaveTownEvent in order to get the proper location.
*/
@EventHandler(priority = EventPriority.LOWEST)
private void playerLeftTownEvent (PlayerLeaveTownEvent event) {
Player player = event.getPlayer();
if (player.hasPermission("townyflight.bypass"))
if (!player.getAllowFlight() || player.hasPermission("townyflight.bypass"))
return;
if (player.getAllowFlight())
TownyFlight.toggleFlight(player, false, true, "");

new BukkitRunnable() {
@Override
public void run() {
executeLeaveTown(player);
}
}.runTask(plugin);
}

/*
* If player has left the town borders into an area they cannot fly in, remove their flight.
* Handles the flightDisableTimer if in use.
*/
private void executeLeaveTown(Player player) {
if (!TownyFlight.canFly(player, true)) {
if (TownyFlight.flightDisableTimer < 1)
TownyFlight.toggleFlight(player, false, true, "");
else {
player.sendMessage(TownyFlight.pluginPrefix + ChatColor.RED + String.format(TownyFlight.returnToAllowedArea, TownyFlight.flightDisableTimer));
new BukkitRunnable() {
@Override
public void run() {
if (!TownyFlight.canFly(player, true))
TownyFlight.toggleFlight(player, false, true, "");
}
}.runTaskLater(plugin, TownyFlight.flightDisableTimer * 20);
}
}
}
}

0 comments on commit 0b1adef

Please sign in to comment.