Add "fly-speed" flag. (#144)

* Add "fly-speed" flag

Similar to walk-speed, but for players who are flying.
This commit is contained in:
Ethan P 2020-10-03 07:34:17 -07:00 committed by GitHub
parent 4d084282e5
commit 146505dd96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 154 additions and 66 deletions

View File

@ -32,6 +32,7 @@ public final class Flags
public final static SetFlag<String> CONSOLE_COMMAND_ON_EXIT = WorldGuardUtils.getCommunicator().getCustomSetFlag("console-command-on-exit", new CommandStringFlag(null));
public final static DoubleFlag WALK_SPEED = new DoubleFlag("walk-speed");
public final static DoubleFlag FLY_SPEED = new DoubleFlag("fly-speed");
public final static BooleanFlag KEEP_INVENTORY = new BooleanFlag("keep-inventory");
public final static BooleanFlag KEEP_EXP = new BooleanFlag("keep-exp");

View File

@ -0,0 +1,83 @@
package net.goldtreeservers.worldguardextraflags.wg.handlers;
import java.util.Set;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.DoubleFlag;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.session.MoveType;
import com.sk89q.worldguard.session.Session;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.wg.WorldGuardUtils;
import net.goldtreeservers.worldguardextraflags.wg.wrappers.HandlerWrapper;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public abstract class AbstractSpeedFlagHandler extends HandlerWrapper
{
private Float originalSpeed;
private DoubleFlag flag;
protected AbstractSpeedFlagHandler(Plugin plugin, Session session, DoubleFlag flag)
{
super(plugin, session);
this.flag = flag;
}
protected abstract float getSpeed(Player player);
protected abstract void setSpeed(Player player, float speed);
@Override
public void initialize(Player player, Location current, ApplicableRegionSet set)
{
Double speed = WorldGuardUtils.queryValue(player, current.getWorld(), set.getRegions(), this.flag);
this.handleValue(player, speed);
}
@Override
public boolean onCrossBoundary(Player player, Location from, Location to, ApplicableRegionSet toSet, Set<ProtectedRegion> entered, Set<ProtectedRegion> exited, MoveType moveType)
{
Double speed = WorldGuardUtils.queryValue(player, to.getWorld(), toSet.getRegions(), this.flag);
this.handleValue(player, speed);
return true;
}
private void handleValue(Player player, Double speed)
{
if (speed != null)
{
if (speed > 1.0)
{
speed = 1.0;
}
else if (speed < -1.0)
{
speed = -1.0;
}
if (this.getSpeed(player) != speed.floatValue())
{
if (this.originalSpeed == null)
{
this.originalSpeed = this.getSpeed(player);
}
this.setSpeed(player, speed.floatValue());
}
}
else
{
if (this.originalSpeed != null)
{
this.setSpeed(player, this.originalSpeed);
this.originalSpeed = null;
}
}
}
}

View File

@ -0,0 +1,48 @@
package net.goldtreeservers.worldguardextraflags.wg.handlers;
import com.sk89q.worldguard.session.Session;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.wg.wrappers.HandlerWrapper;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class FlySpeedFlagHandler extends AbstractSpeedFlagHandler
{
public static final Factory FACTORY(Plugin plugin)
{
return new Factory(plugin);
}
public static class Factory extends HandlerWrapper.Factory<FlySpeedFlagHandler>
{
public Factory(Plugin plugin)
{
super(plugin);
}
@Override
public FlySpeedFlagHandler create(Session session)
{
return new FlySpeedFlagHandler(this.getPlugin(), session);
}
}
protected FlySpeedFlagHandler(Plugin plugin, Session session)
{
super(plugin, session, Flags.FLY_SPEED);
}
@Override
protected float getSpeed(Player player)
{
return player.getFlySpeed();
}
@Override
protected void setSpeed(Player player, float speed)
{
player.setFlySpeed(speed);
}
}

View File

@ -1,95 +1,48 @@
package net.goldtreeservers.worldguardextraflags.wg.handlers;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.session.MoveType;
import com.sk89q.worldguard.session.Session;
import net.goldtreeservers.worldguardextraflags.flags.Flags;
import net.goldtreeservers.worldguardextraflags.wg.WorldGuardUtils;
import net.goldtreeservers.worldguardextraflags.wg.wrappers.HandlerWrapper;
public class WalkSpeedFlagHandler extends HandlerWrapper
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class WalkSpeedFlagHandler extends AbstractSpeedFlagHandler
{
public static final Factory FACTORY(Plugin plugin)
{
return new Factory(plugin);
}
public static class Factory extends HandlerWrapper.Factory<WalkSpeedFlagHandler>
{
public Factory(Plugin plugin)
{
public static class Factory extends HandlerWrapper.Factory<WalkSpeedFlagHandler>
{
public Factory(Plugin plugin)
{
super(plugin);
}
@Override
public WalkSpeedFlagHandler create(Session session)
{
return new WalkSpeedFlagHandler(this.getPlugin(), session);
}
}
private Float originalWalkSpeed;
public WalkSpeedFlagHandler create(Session session)
{
return new WalkSpeedFlagHandler(this.getPlugin(), session);
}
}
protected WalkSpeedFlagHandler(Plugin plugin, Session session)
{
super(plugin, session);
super(plugin, session, Flags.WALK_SPEED);
}
@Override
public void initialize(Player player, Location current, ApplicableRegionSet set)
protected float getSpeed(Player player)
{
Double speed = WorldGuardUtils.queryValue(player, current.getWorld(), set.getRegions(), Flags.WALK_SPEED);
this.handleValue(player, speed);
return player.getWalkSpeed();
}
@Override
public boolean onCrossBoundary(Player player, Location from, Location to, ApplicableRegionSet toSet, Set<ProtectedRegion> entered, Set<ProtectedRegion> exited, MoveType moveType)
protected void setSpeed(Player player, float speed)
{
Double speed = WorldGuardUtils.queryValue(player, to.getWorld(), toSet.getRegions(), Flags.WALK_SPEED);
this.handleValue(player, speed);
return true;
}
private void handleValue(Player player, Double speed)
{
if (speed != null)
{
if (speed > 1.0)
{
speed = 1.0;
}
else if (speed < -1.0)
{
speed = -1.0;
}
if (player.getWalkSpeed() != speed.floatValue())
{
if (this.originalWalkSpeed == null)
{
this.originalWalkSpeed = player.getWalkSpeed();
}
player.setWalkSpeed(speed.floatValue());
}
}
else
{
if (this.originalWalkSpeed != null)
{
player.setWalkSpeed(this.originalWalkSpeed);
this.originalWalkSpeed = null;
}
}
player.setWalkSpeed(speed);
}
}

View File

@ -18,6 +18,7 @@ import net.goldtreeservers.worldguardextraflags.wg.handlers.CommandOnExitFlagHan
import net.goldtreeservers.worldguardextraflags.wg.handlers.ConsoleCommandOnEntryFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.ConsoleCommandOnExitFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.FlyFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.FlySpeedFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.GiveEffectsFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.GlideFlagHandler;
import net.goldtreeservers.worldguardextraflags.wg.handlers.GodmodeFlagHandler;
@ -48,6 +49,7 @@ public interface WorldGuardCommunicator
flagRegistry.register(Flags.WORLDEDIT);
flagRegistry.register(Flags.GIVE_EFFECTS);
flagRegistry.register(Flags.FLY);
flagRegistry.register(Flags.FLY_SPEED);
flagRegistry.register(Flags.PLAY_SOUNDS);
flagRegistry.register(Flags.MYTHICMOB_EGGS);
flagRegistry.register(Flags.FROSTWALKER);
@ -76,6 +78,7 @@ public interface WorldGuardCommunicator
sessionManager.registerHandler(GodmodeFlagHandler.FACTORY(plugin));
sessionManager.registerHandler(GiveEffectsFlagHandler.FACTORY(plugin));
sessionManager.registerHandler(FlyFlagHandler.FACTORY(plugin));
sessionManager.registerHandler(FlySpeedFlagHandler.FACTORY(plugin));
sessionManager.registerHandler(PlaySoundsFlagHandler.FACTORY(plugin));
sessionManager.registerHandler(GlideFlagHandler.FACTORY(plugin));
}