Don't take fall damage after flying

This commit is contained in:
Trent Hensler 2018-03-04 17:27:48 -08:00
parent 055adf2e9e
commit 07eb3756e4
4 changed files with 48 additions and 2 deletions

View File

@ -55,6 +55,10 @@ public interface FPlayer extends EconomyParticipator {
public void setRole(Role role);
public boolean shouldTakeFallDamage();
public void setTakeFallDamage(boolean fallDamage);
public double getPowerBoost();
public void setPowerBoost(double powerBoost);

View File

@ -111,6 +111,12 @@ public class FactionsEntityListener implements Listener {
} else if (Conf.safeZonePreventAllDamageToPlayers && isPlayerInSafeZone(event.getEntity())) {
// Players can not take any damage in a Safe Zone
event.setCancelled(true);
} else if (event.getCause() == EntityDamageEvent.DamageCause.FALL && event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
FPlayer fPlayer = FPlayers.getInstance().getByPlayer(player);
if (fPlayer != null && !fPlayer.shouldTakeFallDamage()) {
event.setCancelled(true); // Falling after /f fly
}
}
// entity took generic damage?

View File

@ -72,6 +72,7 @@ public abstract class MemoryFPlayer implements FPlayer {
protected transient boolean autoWarZoneEnabled;
protected transient boolean loginPvpDisabled;
protected transient long lastFrostwalkerMessage;
protected transient boolean shouldTakeFallDamage = true;
public void login() {
this.kills = getPlayer().getStatistic(Statistic.PLAYER_KILLS);
@ -891,14 +892,36 @@ public abstract class MemoryFPlayer implements FPlayer {
}
public void setFFlying(boolean fly, boolean damage) {
getPlayer().setAllowFlight(fly);
getPlayer().setFlying(fly);
Player player = getPlayer();
if (player != null) {
player.setAllowFlight(fly);
player.setFlying(fly);
}
if (!damage) {
msg(TL.COMMAND_FLY_CHANGE, fly ? "enabled" : "disabled");
} else {
msg(TL.COMMAND_FLY_DAMAGE);
}
// If leaving fly mode, don't let them take fall damage for x seconds.
if (!fly) {
int cooldown = P.p.getConfig().getInt("fly-falldamage-cooldown", 3);
// If the value is 0 or lower, make them take fall damage.
// Otherwise, start a timer and have this cancel after a few seconds.
// Short task so we're just doing it in method. Not clean but eh.
if (cooldown > 0) {
this.shouldTakeFallDamage = false;
Bukkit.getScheduler().runTaskLater(P.p, new Runnable() {
@Override
public void run() {
shouldTakeFallDamage = true;
}
}, 20L * cooldown);
}
}
isFlying = fly;
}
@ -919,6 +942,14 @@ public abstract class MemoryFPlayer implements FPlayer {
return access != null && access == Access.ALLOW;
}
public boolean shouldTakeFallDamage() {
return this.shouldTakeFallDamage;
}
public void setTakeFallDamage(boolean fallDamage) {
this.shouldTakeFallDamage = fallDamage;
}
// -------------------------------------------- //
// Message Sending Helpers
// -------------------------------------------- //

View File

@ -62,6 +62,11 @@ warp-cost:
# Enable Faction Fly:
enable-faction-flight: true
# If a player leaves fly (out of territory or took damage)
# how long should they not take fall damage for?
# Set to 0 to have them always take fall damage.
fly-falldamage-cooldown: 3
# Pistons
# Should we disable pistons in Faction territory? This will prevent people from doing something like:
# http://i.gyazo.com/6a1a31222e58a5d60ff341c13f6a8404.gif