PlayerUtil experiments and probably fixing the Vault integration failure.
This commit is contained in:
parent
25cb50924c
commit
0a281196e6
@ -15,7 +15,6 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.entity.EntityDamageByBlockEvent;
|
import org.bukkit.event.entity.EntityDamageByBlockEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
|
||||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
import org.bukkit.event.player.PlayerKickEvent;
|
import org.bukkit.event.player.PlayerKickEvent;
|
||||||
@ -23,7 +22,6 @@ import org.bukkit.event.player.PlayerLoginEvent;
|
|||||||
import org.bukkit.event.player.PlayerLoginEvent.Result;
|
import org.bukkit.event.player.PlayerLoginEvent.Result;
|
||||||
import org.bukkit.event.player.PlayerChatTabCompleteEvent;
|
import org.bukkit.event.player.PlayerChatTabCompleteEvent;
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
@ -42,7 +40,6 @@ import com.massivecraft.mcore.event.MCoreSenderUnregisterEvent;
|
|||||||
import com.massivecraft.mcore.mixin.Mixin;
|
import com.massivecraft.mcore.mixin.Mixin;
|
||||||
import com.massivecraft.mcore.store.Coll;
|
import com.massivecraft.mcore.store.Coll;
|
||||||
import com.massivecraft.mcore.store.SenderColl;
|
import com.massivecraft.mcore.store.SenderColl;
|
||||||
import com.massivecraft.mcore.util.FlyUtil;
|
|
||||||
import com.massivecraft.mcore.util.IdUtil;
|
import com.massivecraft.mcore.util.IdUtil;
|
||||||
import com.massivecraft.mcore.util.SmokeUtil;
|
import com.massivecraft.mcore.util.SmokeUtil;
|
||||||
import com.massivecraft.mcore.util.Txt;
|
import com.massivecraft.mcore.util.Txt;
|
||||||
@ -73,45 +70,6 @@ public class EngineMainMCore extends EngineAbstract
|
|||||||
MCorePlayerLeaveEvent.player2event.clear();
|
MCorePlayerLeaveEvent.player2event.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FLY UTIL & EVENT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void updateFly(PlayerMoveEvent event)
|
|
||||||
{
|
|
||||||
// If a player ...
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
|
|
||||||
// ... moved from one block to another ...
|
|
||||||
if (event.getFrom().getBlock().equals(event.getTo().getBlock())) return;
|
|
||||||
|
|
||||||
// ... and the player is alive ...
|
|
||||||
if (player.isDead()) return;
|
|
||||||
|
|
||||||
// ... trigger a fly update.
|
|
||||||
FlyUtil.update(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
|
||||||
public void negateNoCheatPlusBug(EntityDamageEvent event)
|
|
||||||
{
|
|
||||||
// If a player ...
|
|
||||||
if ( ! (event.getEntity() instanceof Player)) return;
|
|
||||||
Player player = (Player)event.getEntity();
|
|
||||||
|
|
||||||
// ... is taking fall damage ...
|
|
||||||
if (event.getCause() != DamageCause.FALL) return;
|
|
||||||
|
|
||||||
// ... within 2 seconds of flying ...
|
|
||||||
Long lastActive = FlyUtil.getLastActive(player);
|
|
||||||
if (lastActive == null) return;
|
|
||||||
if (System.currentTimeMillis() - lastActive > 2000) return;
|
|
||||||
|
|
||||||
// ... cancel the event.
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// RECIPIENT CHAT
|
// RECIPIENT CHAT
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
@ -161,8 +161,8 @@ public class MCore extends MPlugin
|
|||||||
EngineScheduledTeleport.get().activate();
|
EngineScheduledTeleport.get().activate();
|
||||||
EngineTeleportMixinCause.get().activate();
|
EngineTeleportMixinCause.get().activate();
|
||||||
EngineWorldNameSet.get().activate();
|
EngineWorldNameSet.get().activate();
|
||||||
EngineCommandRegistration.get().activate(); // TODO: Make all engines
|
EngineCommandRegistration.get().activate();
|
||||||
PlayerUtil.get().setup();
|
PlayerUtil.get().activate();
|
||||||
|
|
||||||
// Tasks
|
// Tasks
|
||||||
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this.collTickTask, 1, 1);
|
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this.collTickTask, 1, 1);
|
||||||
|
55
src/com/massivecraft/mcore/event/EventMCorePlayerUpdate.java
Normal file
55
src/com/massivecraft/mcore/event/EventMCorePlayerUpdate.java
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package com.massivecraft.mcore.event;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
import com.massivecraft.mcore.util.PlayerUtil;
|
||||||
|
|
||||||
|
public class EventMCorePlayerUpdate extends MCoreEvent
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// REQUIRED EVENT CODE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static final HandlerList handlers = new HandlerList();
|
||||||
|
@Override public HandlerList getHandlers() { return handlers; }
|
||||||
|
public static HandlerList getHandlerList() { return handlers; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FIELD
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private final Player player;
|
||||||
|
public Player getPlayer() { return this.player; }
|
||||||
|
|
||||||
|
private double maxHealth;
|
||||||
|
public double getMaxHealth() { return this.maxHealth; }
|
||||||
|
public void setMaxHealth(double maxHealth) { this.maxHealth = maxHealth; }
|
||||||
|
|
||||||
|
private boolean flyAllowed;
|
||||||
|
public boolean isFlyAllowed() { return this.flyAllowed; }
|
||||||
|
public void setAllowed(boolean flyAllowed) { this.flyAllowed = flyAllowed; }
|
||||||
|
|
||||||
|
private boolean flyActive;
|
||||||
|
public boolean isFlyActive() { return this.flyActive; }
|
||||||
|
public void setFlyActive(boolean flyActive) { this.flyActive = flyActive; }
|
||||||
|
|
||||||
|
private float flySpeed;
|
||||||
|
public float getFlySpeed() { return this.flySpeed; }
|
||||||
|
public void setFlySpeed(float flySpeed) { this.flySpeed = flySpeed; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public EventMCorePlayerUpdate(Player player)
|
||||||
|
{
|
||||||
|
this.player = player;
|
||||||
|
this.maxHealth = PlayerUtil.getMaxHealth(player);
|
||||||
|
this.flyAllowed = PlayerUtil.isFlyAllowed(player);
|
||||||
|
this.flyActive = PlayerUtil.isFlyActive(player);
|
||||||
|
this.flySpeed = PlayerUtil.getFlySpeed(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,64 +0,0 @@
|
|||||||
package com.massivecraft.mcore.event;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.HandlerList;
|
|
||||||
|
|
||||||
import com.massivecraft.mcore.util.FlyUtil;
|
|
||||||
|
|
||||||
public class MCorePlayerFlyEvent extends MCoreEvent
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// CONSTANTS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public final static float DEFAULT_SPEED = 0.1f;
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// REQUIRED EVENT CODE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private static final HandlerList handlers = new HandlerList();
|
|
||||||
@Override public HandlerList getHandlers() { return handlers; }
|
|
||||||
public static HandlerList getHandlerList() { return handlers; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// FIELD
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
private final Player player;
|
|
||||||
public Player getPlayer() { return this.player; }
|
|
||||||
|
|
||||||
private boolean allowed;
|
|
||||||
public boolean isAllowed() { return this.allowed; }
|
|
||||||
public void setAllowed(boolean allowed) { this.allowed = allowed; }
|
|
||||||
|
|
||||||
private boolean active;
|
|
||||||
public boolean isActive() { return this.active; }
|
|
||||||
public void setActive(boolean active) { this.active = active; }
|
|
||||||
|
|
||||||
private float speed;
|
|
||||||
public float getSpeed() { return this.speed; }
|
|
||||||
public void setSpeed(float speed) { this.speed = speed; }
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// CONSTRUCT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public MCorePlayerFlyEvent(Player player, boolean allowed, boolean active, float speed)
|
|
||||||
{
|
|
||||||
this.player = player;
|
|
||||||
this.allowed = allowed;
|
|
||||||
this.active = active;
|
|
||||||
this.speed = speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MCorePlayerFlyEvent(Player player)
|
|
||||||
{
|
|
||||||
this.player = player;
|
|
||||||
this.allowed = FlyUtil.isAllowed(player);
|
|
||||||
this.active = FlyUtil.isActive(player);
|
|
||||||
this.speed = FlyUtil.getSpeed(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -24,6 +24,7 @@ public class Money
|
|||||||
if (account == null) return null;
|
if (account == null) return null;
|
||||||
|
|
||||||
// ... but if something is supplied we must manage to extract an id.
|
// ... but if something is supplied we must manage to extract an id.
|
||||||
|
// NOTE: This ID is the name for now, later all money plugins will probably support UUIDs.
|
||||||
String ret = MUtil.extract(String.class, "accountId", account);
|
String ret = MUtil.extract(String.class, "accountId", account);
|
||||||
if (ret == null) throw new IllegalArgumentException("extraction of accountId from object failed");
|
if (ret == null) throw new IllegalArgumentException("extraction of accountId from object failed");
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1,133 +0,0 @@
|
|||||||
package com.massivecraft.mcore.util;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import com.massivecraft.mcore.event.MCorePlayerFlyEvent;
|
|
||||||
|
|
||||||
public class FlyUtil
|
|
||||||
{
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// CONSTANTS
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public final static float DEFAULT_SPEED = 0.1f;
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// LAST ALLOWED
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static Map<UUID, Long> idToLastActive = new HashMap<UUID, Long>();
|
|
||||||
|
|
||||||
public static Long getLastActive(Player player)
|
|
||||||
{
|
|
||||||
return idToLastActive.get(player.getUniqueId());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setLastActive(Player player, Long millis)
|
|
||||||
{
|
|
||||||
idToLastActive.put(player.getUniqueId(), millis);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// UPDATE BY EVENT
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static void update(Player player)
|
|
||||||
{
|
|
||||||
MCorePlayerFlyEvent event = new MCorePlayerFlyEvent(player);
|
|
||||||
event.run();
|
|
||||||
|
|
||||||
setAllowed(player, event.isAllowed());
|
|
||||||
setActive(player, event.isActive());
|
|
||||||
setSpeed(player, event.getSpeed());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void reset(Player player)
|
|
||||||
{
|
|
||||||
setAllowed(player, player.getGameMode() == GameMode.CREATIVE);
|
|
||||||
setActive(player, player.getGameMode() == GameMode.CREATIVE);
|
|
||||||
setSpeed(player, DEFAULT_SPEED);
|
|
||||||
update(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// ALLOWED
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static boolean setAllowed(Player player, boolean allowed)
|
|
||||||
{
|
|
||||||
// NoChange
|
|
||||||
if (isAllowed(player) == allowed) return false;
|
|
||||||
|
|
||||||
// Apply
|
|
||||||
player.setFallDistance(0);
|
|
||||||
player.setAllowFlight(allowed);
|
|
||||||
player.setFallDistance(0);
|
|
||||||
|
|
||||||
// Return
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isAllowed(Player player)
|
|
||||||
{
|
|
||||||
return player.getAllowFlight();
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// ACTIVE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static boolean setActive(Player player, boolean active)
|
|
||||||
{
|
|
||||||
// Last Active Update
|
|
||||||
if (active)
|
|
||||||
{
|
|
||||||
setLastActive(player, System.currentTimeMillis());
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoChange
|
|
||||||
if (isActive(player) == active) return false;
|
|
||||||
|
|
||||||
// Apply
|
|
||||||
player.setFallDistance(0);
|
|
||||||
player.setFlying(active);
|
|
||||||
player.setFallDistance(0);
|
|
||||||
|
|
||||||
// Return
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isActive(Player player)
|
|
||||||
{
|
|
||||||
return player.isFlying();
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// ACTIVE
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public static boolean setSpeed(Player player, float speed)
|
|
||||||
{
|
|
||||||
// NoChange
|
|
||||||
if (getSpeed(player) == speed) return false;
|
|
||||||
|
|
||||||
// Apply
|
|
||||||
player.setFallDistance(0);
|
|
||||||
player.setFlySpeed(speed);
|
|
||||||
player.setFallDistance(0);
|
|
||||||
|
|
||||||
// Return
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float getSpeed(Player player)
|
|
||||||
{
|
|
||||||
return player.getFlySpeed();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -53,6 +53,7 @@ import com.massivecraft.mcore.util.extractor.ExtractorPlayer;
|
|||||||
import com.massivecraft.mcore.util.extractor.ExtractorPlayerName;
|
import com.massivecraft.mcore.util.extractor.ExtractorPlayerName;
|
||||||
import com.massivecraft.mcore.util.extractor.ExtractorSender;
|
import com.massivecraft.mcore.util.extractor.ExtractorSender;
|
||||||
import com.massivecraft.mcore.util.extractor.ExtractorSenderId;
|
import com.massivecraft.mcore.util.extractor.ExtractorSenderId;
|
||||||
|
import com.massivecraft.mcore.util.extractor.ExtractorSenderName;
|
||||||
import com.massivecraft.mcore.util.extractor.ExtractorWorld;
|
import com.massivecraft.mcore.util.extractor.ExtractorWorld;
|
||||||
import com.massivecraft.mcore.util.extractor.ExtractorWorldName;
|
import com.massivecraft.mcore.util.extractor.ExtractorWorldName;
|
||||||
|
|
||||||
@ -696,7 +697,9 @@ public class MUtil
|
|||||||
registerExtractor(World.class, "world", ExtractorWorld.get());
|
registerExtractor(World.class, "world", ExtractorWorld.get());
|
||||||
registerExtractor(String.class, "worldName", ExtractorWorldName.get());
|
registerExtractor(String.class, "worldName", ExtractorWorldName.get());
|
||||||
|
|
||||||
registerExtractor(String.class, "accountId", ExtractorSenderId.get());
|
// The accountId extractor is used for the money mixin.
|
||||||
|
// For now we act on the name instead of the ID since vault needs names.
|
||||||
|
registerExtractor(String.class, "accountId", ExtractorSenderName.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@ package com.massivecraft.mcore.util;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
public class PeriodUtil
|
public class PeriodUtil
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -30,6 +32,31 @@ public class PeriodUtil
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// TICKS STORE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static Map<Object, Long> objectToTicks = new HashMap<Object, Long>();
|
||||||
|
|
||||||
|
public static long getTicks(Object object)
|
||||||
|
{
|
||||||
|
Long ret = objectToTicks.get(object);
|
||||||
|
if (ret == null) ret = 0L;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setTicks(Object object, Long ticks)
|
||||||
|
{
|
||||||
|
if (ticks == null || ticks == 0)
|
||||||
|
{
|
||||||
|
objectToTicks.remove(object);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
objectToTicks.put(object, ticks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// RANDOM SIMPLE
|
// RANDOM SIMPLE
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -51,11 +78,18 @@ public class PeriodUtil
|
|||||||
|
|
||||||
public static boolean isNewPeriod(Object object, long length, long now)
|
public static boolean isNewPeriod(Object object, long length, long now)
|
||||||
{
|
{
|
||||||
|
// If the ticks are the same we are fine!
|
||||||
|
long currentTicks = Bukkit.getWorlds().get(0).getTime();
|
||||||
|
long lastTicks = getTicks(object);
|
||||||
|
if (currentTicks == lastTicks) return true;
|
||||||
|
|
||||||
|
// Otherwise period must be new!
|
||||||
long currentPeriod = getPeriod(length, now);
|
long currentPeriod = getPeriod(length, now);
|
||||||
long lastPeriod = getLastPeriod(object, length);
|
long lastPeriod = getLastPeriod(object, length);
|
||||||
|
|
||||||
if (currentPeriod == lastPeriod) return false;
|
if (currentPeriod == lastPeriod) return false;
|
||||||
|
|
||||||
|
// And then we log data
|
||||||
|
setTicks(object, currentTicks);
|
||||||
setMillis(object, now);
|
setMillis(object, now);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -7,19 +7,26 @@ import java.util.UUID;
|
|||||||
import java.util.concurrent.ConcurrentSkipListSet;
|
import java.util.concurrent.ConcurrentSkipListSet;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import com.massivecraft.mcore.EngineAbstract;
|
||||||
import com.massivecraft.mcore.MCore;
|
import com.massivecraft.mcore.MCore;
|
||||||
|
import com.massivecraft.mcore.event.EventMCorePlayerUpdate;
|
||||||
|
import com.massivecraft.mcore.event.MCoreAfterPlayerRespawnEvent;
|
||||||
|
import com.massivecraft.mcore.event.MCoreAfterPlayerTeleportEvent;
|
||||||
|
|
||||||
public class PlayerUtil implements Listener
|
public class PlayerUtil extends EngineAbstract
|
||||||
{
|
{
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// INSTANCE & CONSTRUCT
|
// INSTANCE & CONSTRUCT
|
||||||
@ -29,38 +36,72 @@ public class PlayerUtil implements Listener
|
|||||||
public static PlayerUtil get() { return i; }
|
public static PlayerUtil get() { return i; }
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// FIELDS
|
// OVERRIDE
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
private static Set<String> joinedPlayerNames = new ConcurrentSkipListSet<String>(String.CASE_INSENSITIVE_ORDER);
|
@Override
|
||||||
|
public void activate()
|
||||||
private static Map<UUID, PlayerDeathEvent> idToDeath = new HashMap<UUID, PlayerDeathEvent>();
|
|
||||||
|
|
||||||
private static Map<UUID, Long> idToLastMoveMillis = new HashMap<UUID, Long>();
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// SETUP
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
public void setup()
|
|
||||||
{
|
{
|
||||||
|
super.activate();
|
||||||
|
|
||||||
idToDeath.clear();
|
idToDeath.clear();
|
||||||
|
|
||||||
joinedPlayerNames.clear();
|
joinedPlayerIds.clear();
|
||||||
for (Player player : Bukkit.getOnlinePlayers())
|
for (Player player : Bukkit.getOnlinePlayers())
|
||||||
{
|
{
|
||||||
joinedPlayerNames.add(player.getName());
|
joinedPlayerIds.add(player.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
idToLastMoveMillis.clear();
|
idToLastMoveMillis.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin getPlugin()
|
||||||
|
{
|
||||||
|
return MCore.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// IS JOINED
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static Set<UUID> joinedPlayerIds = new ConcurrentSkipListSet<UUID>();
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void isJoined(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
final UUID id = event.getPlayer().getUniqueId();
|
||||||
|
Bukkit.getScheduler().scheduleSyncDelayedTask(MCore.get(), new Runnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
joinedPlayerIds.add(id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void isJoined(PlayerQuitEvent event)
|
||||||
|
{
|
||||||
|
final UUID id = event.getPlayer().getUniqueId();
|
||||||
|
joinedPlayerIds.remove(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isJoined(Player player)
|
||||||
|
{
|
||||||
|
if (player == null) throw new NullPointerException("player was null");
|
||||||
|
final UUID id = player.getUniqueId();
|
||||||
|
return joinedPlayerIds.contains(id);
|
||||||
|
|
||||||
Bukkit.getPluginManager().registerEvents(this, MCore.get());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// LAST MOVE & STAND STILL (MILLIS)
|
// LAST MOVE & STAND STILL (MILLIS)
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static Map<UUID, Long> idToLastMoveMillis = new HashMap<UUID, Long>();
|
||||||
|
|
||||||
public static void setLastMoveMillis(Player player, long millis)
|
public static void setLastMoveMillis(Player player, long millis)
|
||||||
{
|
{
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
@ -72,6 +113,25 @@ public class PlayerUtil implements Listener
|
|||||||
setLastMoveMillis(player, System.currentTimeMillis());
|
setLastMoveMillis(player, System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void setLastMoveMillis(PlayerMoveEvent event)
|
||||||
|
{
|
||||||
|
if (MUtil.isSameBlock(event)) return;
|
||||||
|
setLastMoveMillis(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void setLastMoveMillis(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
setLastMoveMillis(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void setLastMoveMillis(PlayerChangedWorldEvent event)
|
||||||
|
{
|
||||||
|
setLastMoveMillis(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
public static long getLastMoveMillis(Player player)
|
public static long getLastMoveMillis(Player player)
|
||||||
{
|
{
|
||||||
if (player == null) return 0;
|
if (player == null) return 0;
|
||||||
@ -94,31 +154,14 @@ public class PlayerUtil implements Listener
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void setLastMoveMillis(PlayerMoveEvent event)
|
|
||||||
{
|
|
||||||
if (MUtil.isSameBlock(event)) return;
|
|
||||||
setLastMoveMillis(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void setLastMoveMillis(PlayerJoinEvent event)
|
|
||||||
{
|
|
||||||
setLastMoveMillis(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void setLastMoveMillis(PlayerChangedWorldEvent event)
|
|
||||||
{
|
|
||||||
setLastMoveMillis(event.getPlayer());
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// IS DUPLICATE DEATH EVENT
|
// IS DUPLICATE DEATH EVENT
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// Some times when players die the PlayerDeathEvent is fired twice.
|
// Some times when players die the PlayerDeathEvent is fired twice.
|
||||||
// We want to ignore the extra calls.
|
// We want to ignore the extra calls.
|
||||||
|
|
||||||
|
private static Map<UUID, PlayerDeathEvent> idToDeath = new HashMap<UUID, PlayerDeathEvent>();
|
||||||
|
|
||||||
public static boolean isDuplicateDeathEvent(PlayerDeathEvent event)
|
public static boolean isDuplicateDeathEvent(PlayerDeathEvent event)
|
||||||
{
|
{
|
||||||
// Prepare the lowercase name ...
|
// Prepare the lowercase name ...
|
||||||
@ -152,37 +195,6 @@ public class PlayerUtil implements Listener
|
|||||||
isDuplicateDeathEvent(event);
|
isDuplicateDeathEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
|
||||||
// IS JOINED
|
|
||||||
// -------------------------------------------- //
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
|
||||||
public void joinMonitor(PlayerJoinEvent event)
|
|
||||||
{
|
|
||||||
final String playerName = event.getPlayer().getName();
|
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(MCore.get(), new Runnable()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
joinedPlayerNames.add(playerName);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
|
||||||
public void quitMonitor(PlayerQuitEvent event)
|
|
||||||
{
|
|
||||||
final String playerName = event.getPlayer().getName();
|
|
||||||
joinedPlayerNames.remove(playerName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isJoined(Player player)
|
|
||||||
{
|
|
||||||
if (player == null) throw new NullPointerException("player was null");
|
|
||||||
return joinedPlayerNames.contains(player.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// PACKET
|
// PACKET
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -202,4 +214,245 @@ public class PlayerUtil implements Listener
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// SETTINGS BY EVENT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static void update(Player player)
|
||||||
|
{
|
||||||
|
EventMCorePlayerUpdate event = new EventMCorePlayerUpdate(player);
|
||||||
|
event.run();
|
||||||
|
|
||||||
|
setMaxHealth(player, event.getMaxHealth());
|
||||||
|
setFlyAllowed(player, event.isFlyAllowed());
|
||||||
|
setFlyActive(player, event.isFlyActive());
|
||||||
|
setFlySpeed(player, event.getFlySpeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void reset(Player player)
|
||||||
|
{
|
||||||
|
setMaxHealth(player, getMaxHealthDefault(player));
|
||||||
|
setFlyAllowed(player, isFlyAllowedDefault(player));
|
||||||
|
setFlyActive(player, isFlyActiveDefault(player));
|
||||||
|
setFlySpeed(player, getFlySpeedDefault(player));
|
||||||
|
|
||||||
|
update(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Can't be cancelled
|
||||||
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
|
public void reset(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
// If we have a player ...
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
// ... and the player is alive ...
|
||||||
|
if (player.isDead()) return;
|
||||||
|
|
||||||
|
// ... trigger.
|
||||||
|
reset(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void update(MCoreAfterPlayerTeleportEvent event)
|
||||||
|
{
|
||||||
|
// If we have a player ...
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
// ... and the player is alive ...
|
||||||
|
if (player.isDead()) return;
|
||||||
|
|
||||||
|
// ... trigger.
|
||||||
|
update(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void update(MCoreAfterPlayerRespawnEvent event)
|
||||||
|
{
|
||||||
|
// If we have a player ...
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
// ... and the player is alive ...
|
||||||
|
if (player.isDead()) return;
|
||||||
|
|
||||||
|
// ... trigger.
|
||||||
|
update(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void update(PlayerChangedWorldEvent event)
|
||||||
|
{
|
||||||
|
// If we have a player ...
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
// ... and the player is alive ...
|
||||||
|
if (player.isDead()) return;
|
||||||
|
|
||||||
|
// ... trigger.
|
||||||
|
update(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void update(PlayerMoveEvent event)
|
||||||
|
{
|
||||||
|
// If we have a player ...
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
// ... and the player is alive ...
|
||||||
|
if (player.isDead()) return;
|
||||||
|
|
||||||
|
// ... and the player moved from one block to another ...
|
||||||
|
if (event.getFrom().getBlock().equals(event.getTo().getBlock())) return;
|
||||||
|
|
||||||
|
// ... trigger.
|
||||||
|
update(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// MAX HEALTH
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static boolean setMaxHealth(Player player, double maxHealth)
|
||||||
|
{
|
||||||
|
// NoChange
|
||||||
|
if (getMaxHealth(player) == maxHealth) return false;
|
||||||
|
|
||||||
|
// Apply
|
||||||
|
player.setMaxHealth(maxHealth);
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double getMaxHealth(Player player)
|
||||||
|
{
|
||||||
|
return player.getMaxHealth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double getMaxHealthDefault(Player player)
|
||||||
|
{
|
||||||
|
return 20D;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FLY: ALLOWED
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static boolean setFlyAllowed(Player player, boolean allowed)
|
||||||
|
{
|
||||||
|
// NoChange
|
||||||
|
if (isFlyAllowed(player) == allowed) return false;
|
||||||
|
|
||||||
|
// Apply
|
||||||
|
player.setFallDistance(0);
|
||||||
|
player.setAllowFlight(allowed);
|
||||||
|
player.setFallDistance(0);
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFlyAllowed(Player player)
|
||||||
|
{
|
||||||
|
return player.getAllowFlight();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFlyAllowedDefault(Player player)
|
||||||
|
{
|
||||||
|
return player.getGameMode() == GameMode.CREATIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FLY: ACTIVE
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static Map<UUID, Long> idToLastFlyActive = new HashMap<UUID, Long>();
|
||||||
|
public static Long getLastFlyActive(Player player)
|
||||||
|
{
|
||||||
|
return idToLastFlyActive.get(player.getUniqueId());
|
||||||
|
}
|
||||||
|
public static void setLastFlyActive(Player player, Long millis)
|
||||||
|
{
|
||||||
|
idToLastFlyActive.put(player.getUniqueId(), millis);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||||
|
public void negateNoCheatPlusBug(EntityDamageEvent event)
|
||||||
|
{
|
||||||
|
// If a player ...
|
||||||
|
if ( ! (event.getEntity() instanceof Player)) return;
|
||||||
|
Player player = (Player)event.getEntity();
|
||||||
|
|
||||||
|
// ... is taking fall damage ...
|
||||||
|
if (event.getCause() != DamageCause.FALL) return;
|
||||||
|
|
||||||
|
// ... within 2 seconds of flying ...
|
||||||
|
Long lastActive = getLastFlyActive(player);
|
||||||
|
if (lastActive == null) return;
|
||||||
|
if (System.currentTimeMillis() - lastActive > 2000) return;
|
||||||
|
|
||||||
|
// ... cancel the event.
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setFlyActive(Player player, boolean active)
|
||||||
|
{
|
||||||
|
// Last Active Update
|
||||||
|
if (active)
|
||||||
|
{
|
||||||
|
setLastFlyActive(player, System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
// NoChange
|
||||||
|
if (isFlyActive(player) == active) return false;
|
||||||
|
|
||||||
|
// Apply
|
||||||
|
player.setFallDistance(0);
|
||||||
|
player.setFlying(active);
|
||||||
|
player.setFallDistance(0);
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFlyActive(Player player)
|
||||||
|
{
|
||||||
|
return player.isFlying();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isFlyActiveDefault(Player player)
|
||||||
|
{
|
||||||
|
return player.getGameMode() == GameMode.CREATIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// FLY: SPEED
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public final static float DEFAULT_FLY_SPEED = 0.1f;
|
||||||
|
|
||||||
|
public static boolean setFlySpeed(Player player, float speed)
|
||||||
|
{
|
||||||
|
// NoChange
|
||||||
|
if (getFlySpeed(player) == speed) return false;
|
||||||
|
|
||||||
|
// Apply
|
||||||
|
player.setFallDistance(0);
|
||||||
|
player.setFlySpeed(speed);
|
||||||
|
player.setFallDistance(0);
|
||||||
|
|
||||||
|
// Return
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getFlySpeed(Player player)
|
||||||
|
{
|
||||||
|
return player.getFlySpeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float getFlySpeedDefault(Player player)
|
||||||
|
{
|
||||||
|
return DEFAULT_FLY_SPEED;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,17 @@ public class ExtractorLogic
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// PLAYER
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static Player playerFromObject(Object o)
|
||||||
|
{
|
||||||
|
CommandSender sender = senderFromObject(o);
|
||||||
|
if (sender instanceof Player) return (Player)sender;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// SENDER ID
|
// SENDER ID
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -104,14 +115,20 @@ public class ExtractorLogic
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
// PLAYER
|
// SENDER NAME
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
|
|
||||||
public static Player playerFromObject(Object o)
|
public static String senderNameFromObject(Object o)
|
||||||
{
|
{
|
||||||
|
if (o == null) return null;
|
||||||
|
|
||||||
|
String name = IdUtil.getName(o);
|
||||||
|
if (name != null) return name;
|
||||||
|
|
||||||
CommandSender sender = senderFromObject(o);
|
CommandSender sender = senderFromObject(o);
|
||||||
if (sender instanceof Player) return (Player)sender;
|
if (sender == null) return null;
|
||||||
return null;
|
|
||||||
|
return IdUtil.getName(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -------------------------------------------- //
|
// -------------------------------------------- //
|
||||||
@ -120,7 +137,7 @@ public class ExtractorLogic
|
|||||||
|
|
||||||
public static String playerNameFromObject(Object o)
|
public static String playerNameFromObject(Object o)
|
||||||
{
|
{
|
||||||
String senderId = senderIdFromObject(o);
|
String senderId = senderNameFromObject(o);
|
||||||
//if (SenderUtil.isPlayerId(senderId)) return senderId;
|
//if (SenderUtil.isPlayerId(senderId)) return senderId;
|
||||||
//return null;
|
//return null;
|
||||||
return senderId;
|
return senderId;
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.massivecraft.mcore.util.extractor;
|
||||||
|
|
||||||
|
public class ExtractorSenderName implements Extractor
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// INSTANCE & CONSTRUCT
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
private static ExtractorSenderName i = new ExtractorSenderName();
|
||||||
|
public static ExtractorSenderName get() { return i; }
|
||||||
|
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// OVERRIDE: EXTRACTOR
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object extract(Object o)
|
||||||
|
{
|
||||||
|
return ExtractorLogic.senderNameFromObject(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user