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

204 lines
6.1 KiB
Java
Raw Normal View History

package com.earth2me.essentials;
import static com.earth2me.essentials.I18n._;
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;
import org.bukkit.Material;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
2013-01-17 19:25:19 +00:00
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
2013-03-16 09:16:33 +00:00
import org.bukkit.event.entity.*;
import org.bukkit.inventory.ItemStack;
public class EssentialsEntityListener implements Listener
{
2012-08-31 17:52:40 +00:00
private static final Logger LOGGER = Logger.getLogger("Minecraft");
private final IEssentials ess;
2013-02-11 23:33:30 +00:00
private static final transient Pattern powertoolPlayer = Pattern.compile("\\{player\\}");
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)
{
2012-03-02 16:54:12 +00:00
final User attacker = ess.getUser(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)
{
2012-12-30 03:31:05 +00:00
final ItemStack hand = attacker.getItemInHand();
if (hand != null && hand.getType() == Material.MILK_BUCKET)
{
((Ageable)eDefend).setBaby();
hand.setType(Material.BUCKET);
2012-12-30 03:31:05 +00:00
attacker.setItemInHand(hand);
attacker.updateInventory();
event.setCancelled(true);
}
}
2012-12-30 03:31:05 +00:00
attacker.updateActivity(true);
}
else if (eAttack instanceof Projectile && eDefend instanceof Player)
{
Entity shooter = ((Projectile)event.getDamager()).getShooter();
if (shooter instanceof Player)
{
final User attacker = ess.getUser(shooter);
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.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))
{
ess.scheduleSyncDelayedTask(
new Runnable()
{
@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));
}
});
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(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(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(_("backAfterDeath"));
}
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)
{
2011-09-22 08:47:39 +00:00
if (event.getEntity() instanceof Player && ess.getUser(event.getEntity()).isGodModeEnabled())
{
2013-02-05 23:33:22 +00:00
final Player player = (Player)event.getEntity();
player.setFoodLevel(20);
player.setSaturation(10);
2011-10-04 08:05:04 +00:00
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(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(entity).isGodModeEnabled())
{
event.setIntensity(entity, 0d);
}
}
}
}