TF-EssentialsX/Essentials/src/com/earth2me/essentials/EssentialsEntityListener.java

227 lines
6.8 KiB
Java
Raw Normal View History

package com.earth2me.essentials;
import static com.earth2me.essentials.I18n.tl;
2011-08-21 18:02:01 +00:00
import java.util.List;
2012-08-31 17:52:40 +00:00
import java.util.logging.Level;
import java.util.logging.Logger;
2013-02-11 23:33:30 +00:00
import java.util.regex.Pattern;
2013-10-11 02:44:41 +00:00
import net.ess3.api.IEssentials;
import org.bukkit.Material;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
2013-03-16 09:16:33 +00:00
import org.bukkit.event.entity.*;
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
import org.bukkit.inventory.ItemStack;
public class EssentialsEntityListener implements Listener
{
2013-12-07 20:03:05 +00:00
private static final Logger LOGGER = Logger.getLogger("Essentials");
2013-02-11 23:33:30 +00:00
private static final transient Pattern powertoolPlayer = Pattern.compile("\\{player\\}");
private final IEssentials ess;
public EssentialsEntityListener(IEssentials ess)
{
this.ess = ess;
}
2012-10-06 02:31:34 +00:00
// This method does something undocumented reguarding certain bucket types #EasterEgg
2012-06-10 17:33:07 +00:00
@EventHandler(priority = EventPriority.LOW)
2012-03-02 16:54:12 +00:00
public void onEntityDamage(final EntityDamageByEntityEvent event)
{
2012-03-02 16:54:12 +00:00
final Entity eAttack = event.getDamager();
final Entity eDefend = event.getEntity();
2012-12-30 03:31:05 +00:00
if (eAttack instanceof Player)
{
final User attacker = ess.getUser((Player)eAttack);
2012-12-30 03:31:05 +00:00
if (eDefend instanceof Player)
{
2012-12-30 03:31:05 +00:00
onPlayerVsPlayerDamage(event, (Player)eDefend, attacker);
}
2012-12-30 03:31:05 +00:00
else if (eDefend instanceof Ageable)
{
final ItemStack hand = attacker.getBase().getItemInHand();
if (hand != null && hand.getType() == Material.MILK_BUCKET)
{
((Ageable)eDefend).setBaby();
hand.setType(Material.BUCKET);
attacker.getBase().setItemInHand(hand);
attacker.getBase().updateInventory();
event.setCancelled(true);
}
}
2012-12-30 03:31:05 +00:00
attacker.updateActivity(true);
}
else if (eAttack instanceof Projectile && eDefend instanceof Player)
{
final Projectile projectile = (Projectile)event.getDamager();
2014-02-19 00:58:20 +00:00
//This should return a ProjectileSource on 1.7.3 beta +
final Object shooter = projectile.getShooter();
2012-12-30 03:31:05 +00:00
if (shooter instanceof Player)
{
final User attacker = ess.getUser((Player)shooter);
2012-12-30 03:31:05 +00:00
onPlayerVsPlayerDamage(event, (Player)eDefend, attacker);
attacker.updateActivity(true);
}
}
2012-03-02 16:54:12 +00:00
}
2012-12-30 03:31:05 +00:00
private void onPlayerVsPlayerDamage(final EntityDamageByEntityEvent event, final Player defender, final User attacker)
{
2013-02-11 23:33:30 +00:00
if (ess.getSettings().getLoginAttackDelay() > 0
&& (System.currentTimeMillis() < (attacker.getLastLogin() + ess.getSettings().getLoginAttackDelay()))
&& !attacker.isAuthorized("essentials.pvpdelay.exempt"))
{
event.setCancelled(true);
}
2012-12-30 03:31:05 +00:00
if (!defender.equals(attacker.getBase()) && (attacker.hasInvulnerabilityAfterTeleport() || ess.getUser(defender).hasInvulnerabilityAfterTeleport()))
{
event.setCancelled(true);
}
if (attacker.isGodModeEnabled() && !attacker.isAuthorized("essentials.god.pvp"))
{
event.setCancelled(true);
}
if (attacker.isHidden() && !attacker.isAuthorized("essentials.vanish.pvp"))
{
event.setCancelled(true);
}
2012-12-30 03:31:05 +00:00
onPlayerVsPlayerPowertool(event, defender, attacker);
}
2012-12-30 03:31:05 +00:00
private void onPlayerVsPlayerPowertool(final EntityDamageByEntityEvent event, final Player defender, final User attacker)
{
final List<String> commandList = attacker.getPowertool(attacker.getBase().getItemInHand());
if (commandList != null && !commandList.isEmpty())
{
for (final String tempCommand : commandList)
{
2013-02-11 23:33:30 +00:00
final String command = powertoolPlayer.matcher(tempCommand).replaceAll(defender.getName());
if (command != null && !command.isEmpty() && !command.equals(tempCommand))
{
class PowerToolInteractTask implements Runnable
2013-10-11 02:44:41 +00:00
{
@Override
public void run()
{
attacker.getServer().dispatchCommand(attacker.getBase(), command);
LOGGER.log(Level.INFO, String.format("[PT] %s issued server command: /%s", attacker.getName(), command));
}
}
ess.scheduleSyncDelayedTask(new PowerToolInteractTask());
event.setCancelled(true);
return;
}
}
}
}
2012-06-10 17:33:07 +00:00
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
2012-03-02 16:54:12 +00:00
public void onEntityDamage(final EntityDamageEvent event)
{
if (event.getEntity() instanceof Player && ess.getUser((Player)event.getEntity()).isGodModeEnabled())
{
final Player player = (Player)event.getEntity();
player.setFireTicks(0);
player.setRemainingAir(player.getMaximumAir());
event.setCancelled(true);
}
}
2012-06-10 17:33:07 +00:00
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
2012-03-02 16:54:12 +00:00
public void onEntityCombust(final EntityCombustEvent event)
{
if (event.getEntity() instanceof Player && ess.getUser((Player)event.getEntity()).isGodModeEnabled())
{
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
2012-03-02 16:54:12 +00:00
public void onPlayerDeathEvent(final PlayerDeathEvent event)
{
2012-03-02 16:54:12 +00:00
final User user = ess.getUser(event.getEntity());
if (user.isAuthorized("essentials.back.ondeath") && !ess.getSettings().isCommandDisabled("back"))
{
2012-03-02 16:54:12 +00:00
user.setLastLocation();
user.sendMessage(tl("backAfterDeath"));
2012-03-02 16:54:12 +00:00
}
if (!ess.getSettings().areDeathMessagesEnabled())
{
event.setDeathMessage("");
}
}
@EventHandler(priority = EventPriority.LOW)
public void onPlayerDeathExpEvent(final PlayerDeathEvent event)
{
final User user = ess.getUser(event.getEntity());
if (user.isAuthorized("essentials.keepxp"))
{
event.setKeepLevel(true);
event.setDroppedExp(0);
}
}
2012-06-10 17:33:07 +00:00
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
2012-03-02 16:54:12 +00:00
public void onFoodLevelChange(final FoodLevelChangeEvent event)
{
if (event.getEntity() instanceof Player)
{
final User user = ess.getUser((Player)event.getEntity());
if (user.isGodModeEnabled())
{
if (user.isGodModeEnabledRaw())
{
user.getBase().setFoodLevel(20);
user.getBase().setSaturation(10);
}
event.setCancelled(true);
}
2011-09-22 08:47:39 +00:00
}
}
2012-06-10 17:33:07 +00:00
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
2012-03-02 16:54:12 +00:00
public void onEntityRegainHealth(final EntityRegainHealthEvent event)
{
if (event.getRegainReason() == RegainReason.SATIATED && event.getEntity() instanceof Player
&& ess.getUser((Player)event.getEntity()).isAfk() && ess.getSettings().getFreezeAfkPlayers())
{
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPotionSplashEvent(final PotionSplashEvent event)
{
for (LivingEntity entity : event.getAffectedEntities())
{
if (entity instanceof Player && ess.getUser((Player)entity).isGodModeEnabled())
{
event.setIntensity(entity, 0d);
}
}
}
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onEntityShootBow(EntityShootBowEvent event)
{
2013-04-16 20:16:07 +00:00
if (event.getEntity() instanceof Player)
{
final User user = ess.getUser((Player)event.getEntity());
2013-04-16 20:16:07 +00:00
if (user.isAfk())
{
user.updateActivity(true);
}
}
}
}