102 lines
3.1 KiB
Java
102 lines
3.1 KiB
Java
|
package com.massivecraft.factions.engine;
|
||
|
|
||
|
import com.massivecraft.factions.entity.BoardColl;
|
||
|
import com.massivecraft.factions.entity.Faction;
|
||
|
import com.massivecraft.factions.entity.MConf;
|
||
|
import com.massivecraft.factions.entity.MFlag;
|
||
|
import com.massivecraft.factions.entity.MPlayer;
|
||
|
import com.massivecraft.massivecore.Engine;
|
||
|
import com.massivecraft.massivecore.event.EventMassiveCorePlayerUpdate;
|
||
|
import com.massivecraft.massivecore.ps.PS;
|
||
|
import com.massivecraft.massivecore.util.MUtil;
|
||
|
import org.bukkit.entity.Player;
|
||
|
import org.bukkit.event.EventHandler;
|
||
|
import org.bukkit.event.EventPriority;
|
||
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||
|
|
||
|
public class EngineFly extends Engine
|
||
|
{
|
||
|
// -------------------------------------------- //
|
||
|
// INSTANCE & CONSTRUCT
|
||
|
// -------------------------------------------- //
|
||
|
|
||
|
private static EngineFly i = new EngineFly();
|
||
|
public static EngineFly get() { return i; }
|
||
|
|
||
|
// -------------------------------------------- //
|
||
|
// LISTENER
|
||
|
// -------------------------------------------- //
|
||
|
|
||
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||
|
public void onMassiveCorePlayerUpdate(EventMassiveCorePlayerUpdate event)
|
||
|
{
|
||
|
// If we are updating a player ...
|
||
|
Player player = event.getPlayer();
|
||
|
if (MUtil.isntPlayer(player)) return;
|
||
|
|
||
|
// ... and that player isn't in creative or spectator mode ...
|
||
|
if (EventMassiveCorePlayerUpdate.isFlyAllowed(player, false)) return;
|
||
|
|
||
|
// ... and the player is alive ...
|
||
|
if (player.isDead()) return;
|
||
|
|
||
|
MPlayer mplayer = MPlayer.get(player);
|
||
|
|
||
|
// ... and the player enables flying ...
|
||
|
if (!mplayer.isFlying()) return;
|
||
|
|
||
|
// ... and the player enables flying ...
|
||
|
if (!canFlyInTerritory(mplayer, PS.valueOf(player))) return;
|
||
|
|
||
|
// ... set allowed ...
|
||
|
event.setAllowed(true);
|
||
|
|
||
|
// ... set speed ...
|
||
|
event.setFlySpeed(MConf.get().flySpeed);
|
||
|
}
|
||
|
|
||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||
|
public void moveChunkDetect(PlayerMoveEvent event)
|
||
|
{
|
||
|
// If the player is moving from one chunk to another ...
|
||
|
if (MUtil.isSameChunk(event)) return;
|
||
|
Player player = event.getPlayer();
|
||
|
if (MUtil.isntPlayer(player)) return;
|
||
|
|
||
|
// ... gather info on the player and the move ...
|
||
|
MPlayer mplayer = MPlayer.get(player);
|
||
|
PS chunkTo = PS.valueOf(event.getTo()).getChunk(true);
|
||
|
|
||
|
// ... and they are currently flying ...
|
||
|
if (!mplayer.isFlying()) return;
|
||
|
|
||
|
// ... but can't fly at the new place ...
|
||
|
if (canFlyInTerritory(mplayer, chunkTo)) return;
|
||
|
|
||
|
// ... then perhaps they should not be
|
||
|
mplayer.setFlying(false);
|
||
|
deactivateForPlayer(player);
|
||
|
}
|
||
|
|
||
|
public static boolean canFlyInTerritory(MPlayer mplayer, PS ps)
|
||
|
{
|
||
|
Faction faction = mplayer.getFaction();
|
||
|
Faction locationFaction = BoardColl.get().getFactionAt(ps.getChunk(true));
|
||
|
|
||
|
if (faction != locationFaction) return false;
|
||
|
if (!faction.getFlag(MFlag.getFlagFly())) return false;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public static void deactivateForPlayer(Player player)
|
||
|
{
|
||
|
EventMassiveCorePlayerUpdate.resetFlyAllowed(player);
|
||
|
EventMassiveCorePlayerUpdate.resetFlyActive(player);
|
||
|
EventMassiveCorePlayerUpdate.resetFlySpeed(player);
|
||
|
|
||
|
EventMassiveCorePlayerUpdate.run(player);
|
||
|
}
|
||
|
|
||
|
}
|