/*
* ReActions, Minecraft bukkit plugin
* (c)2012-2017, fromgate, fromgate@gmail.com
* http://dev.bukkit.org/server-mods/reactions/
*
* This file is part of ReActions.
*
* ReActions is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ReActions is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ReActions. If not, see <http://www.gnorg/licenses/>.
*
*/
package me.fromgate.reactions.event;
import me.fromgate.reactions.ReActions;
import me.fromgate.reactions.activators.Activator;
import me.fromgate.reactions.activators.ActivatorType;
import me.fromgate.reactions.activators.Activators;
import me.fromgate.reactions.activators.ItemHoldActivator;
import me.fromgate.reactions.activators.ItemWearActivator;
import me.fromgate.reactions.activators.MessageActivator;
import me.fromgate.reactions.activators.PlayerDeathActivator;
import me.fromgate.reactions.activators.SignActivator;
import me.fromgate.reactions.externals.RAWorldGuard;
import me.fromgate.reactions.util.BukkitCompatibilityFix;
import me.fromgate.reactions.util.Cfg;
import me.fromgate.reactions.util.Param;
import me.fromgate.reactions.util.Util;
import me.fromgate.reactions.util.item.ItemUtil;
import me.fromgate.reactions.util.message.M;
import me.fromgate.reactions.util.playerselector.PlayerSelectors;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleFlightEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Button;
import org.bukkit.metadata.FixedMetadataValue;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class EventManager {
private static ReActions plg() {
return ReActions.instance;
}
public static boolean raiseFactionEvent(Player p, String oldFaction, String newFaction) {
FactionEvent e = new FactionEvent(p, oldFaction, newFaction);
Bukkit.getServer().getPluginManager().callEvent(e);
return true;
}
public static boolean raiseFactionCreateEvent(String factionName, Player player) {
FactionCreateEvent e = new FactionCreateEvent(factionName, player);
Bukkit.getServer().getPluginManager().callEvent(e);
return true;
}
public static boolean raiseFactionDisbandEvent(String factionName, Player player) {
FactionDisbandEvent e = new FactionDisbandEvent(factionName, player);
Bukkit.getServer().getPluginManager().callEvent(e);
return true;
}
public static boolean raiseFactionRelationEvent(String faction, String factionOther, String oldRelation, String newRelation) {
FactionRelationEvent e = new FactionRelationEvent(faction, factionOther, oldRelation, newRelation);
Bukkit.getServer().getPluginManager().callEvent(e);
return true;
}
public static boolean raiseMobClickEvent(Player p, LivingEntity mob) {
if (mob == null) return false;
MobClickEvent e = new MobClickEvent(p, mob);
Bukkit.getServer().getPluginManager().callEvent(e);
return true;
}
public static boolean raiseMobKillEvent(Player p, LivingEntity mob) {
if (mob == null) return false;
MobKillEvent e = new MobKillEvent(p, mob);
Bukkit.getServer().getPluginManager().callEvent(e);
return true;
}
public static boolean raiseJoinEvent(Player player, boolean joinfirst) {
JoinEvent e = new JoinEvent(player, joinfirst);
Bukkit.getServer().getPluginManager().callEvent(e);
return true;
}
public static boolean raiseDoorEvent(PlayerInteractEvent event) {
if (!((event.getAction() == Action.RIGHT_CLICK_BLOCK) || (event.getAction() == Action.LEFT_CLICK_BLOCK)))
return false;
if (!Util.isDoorBlock(event.getClickedBlock())) return false;
DoorEvent e = new DoorEvent(event.getPlayer(), Util.getDoorBottomBlock(event.getClickedBlock()));
Bukkit.getServer().getPluginManager().callEvent(e);
return e.isCancelled();
}
public static boolean raiseItemConsumeEvent(PlayerItemConsumeEvent event) {
if (event.getItem() == null) return false;
ItemConsumeEvent ce = new ItemConsumeEvent(event.getPlayer());
Bukkit.getServer().getPluginManager().callEvent(ce);
return ce.isCancelled();
}
public static boolean raiseItemClickEvent(PlayerInteractEntityEvent event) {
ItemStack itemInHand = BukkitCompatibilityFix.getItemInHand(event.getPlayer());
if (itemInHand == null || itemInHand.getType() == Material.AIR) return false;
ItemClickEvent ice = new ItemClickEvent(event.getPlayer());
Bukkit.getServer().getPluginManager().callEvent(ice);
return true;
}
public static boolean raiseItemClickEvent(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return false;
}
ItemStack itemInHand = BukkitCompatibilityFix.getItemInHand(event.getPlayer());
if (itemInHand == null || itemInHand.getType() == Material.AIR) return false;
ItemClickEvent ice = new ItemClickEvent(event.getPlayer());
Bukkit.getServer().getPluginManager().callEvent(ice);
return true;
}
public static boolean raiseLeverEvent(PlayerInteractEvent event) {
if (!((event.getAction() == Action.RIGHT_CLICK_BLOCK) || (event.getAction() == Action.LEFT_CLICK_BLOCK)))
return false;
if (event.getClickedBlock().getType() != Material.LEVER) return false;
LeverEvent e = new LeverEvent(event.getPlayer(), event.getClickedBlock());
Bukkit.getServer().getPluginManager().callEvent(e);
return e.isCancelled();
}
// PVP Kill Event
public static void raisePVPKillEvent(PlayerDeathEvent event) {
Player deadplayer = event.getEntity();
Player killer = Util.getKiller(deadplayer.getLastDamageCause());
if (killer == null) return;
PVPKillEvent pe = new PVPKillEvent(killer, deadplayer);
Bukkit.getServer().getPluginManager().callEvent(pe);
}
// PVP Death Event
public static void raisePVPDeathEvent(PlayerDeathEvent event) {
Player deadplayer = event.getEntity();
LivingEntity killer = Util.getAnyKiller(deadplayer.getLastDamageCause());
PlayerDeathActivator.DeathCause ds = (killer == null) ? PlayerDeathActivator.DeathCause.OTHER : (killer instanceof Player) ? PlayerDeathActivator.DeathCause.PVP : PlayerDeathActivator.DeathCause.PVE;
PlayerWasKilledEvent pe = new PlayerWasKilledEvent(killer, deadplayer, ds);
Bukkit.getServer().getPluginManager().callEvent(pe);
}
// Button Event
public static boolean raiseButtonEvent(PlayerInteractEvent event) {
if (!((event.getAction() == Action.RIGHT_CLICK_BLOCK) || (event.getAction() == Action.LEFT_CLICK_BLOCK)))
return false;
if (!((event.getClickedBlock().getType() == Material.STONE_BUTTON) || (event.getClickedBlock().getType() == Material.WOOD_BUTTON)))
return false;
BlockState state = event.getClickedBlock().getState();
if (state.getData() instanceof Button) {
Button button = (Button) state.getData();
if (button.isPowered()) return false;
}
ButtonEvent be = new ButtonEvent(event.getPlayer(), event.getClickedBlock().getLocation());
Bukkit.getServer().getPluginManager().callEvent(be);
return be.isCancelled();
}
public static boolean raiseSignEvent(Player player, String[] lines, Location loc, boolean leftClick) {
for (Activator act : Activators.getActivators(ActivatorType.SIGN)) {
SignActivator sign = (SignActivator) act;
if (sign.checkMask(lines)) {
SignEvent se = new SignEvent(player, lines, loc, leftClick);
Bukkit.getServer().getPluginManager().callEvent(se);
return true;
}
}
return false;
}
public static boolean raiseCommandEvent(Player p, String command, boolean canceled) {
if (command.isEmpty()) return false;
String[] args = command.split(" ");
CommandEvent ce = new CommandEvent(p, command, args, canceled);
Bukkit.getServer().getPluginManager().callEvent(ce);
return ce.isCancelled();
}
public static boolean raiseExecEvent(CommandSender sender, String param) {
if (param.isEmpty()) return false;
return raiseExecEvent(sender, new Param(param, "player"));
}
public static boolean raiseExecEvent(CommandSender sender, Param param) {
return raiseExecEvent(sender, param, null);
}
public static boolean raiseExecEvent(CommandSender sender, Param param, final Param tempVars) {
if (param.isEmpty()) return false;
final Player senderPlayer = (sender instanceof Player) ? (Player) sender : null;
final String id = param.getParam("activator", param.getParam("exec"));
if (id.isEmpty()) return false;
Activator act = Activators.get(id);
if (act == null) {
M.logOnce("wrongact_" + id, "Failed to run exec activator " + id + ". Activator not found.");
return false;
}
if (act.getType() != ActivatorType.EXEC) {
M.logOnce("wrongactype_" + id, "Failed to run exec activator " + id + ". Wrong activator type.");
return false;
}
int repeat = Math.min(param.getParam("repeat", 1), 1);
long delay = Util.timeToTicks(Util.parseTime(param.getParam("delay", "1t")));
final Set<Player> target = new HashSet<>();
if (param.isParamsExists("player")) {
target.addAll(PlayerSelectors.getPlayerList(new Param(param.getParam("player"), "player")));
}
target.addAll(PlayerSelectors.getPlayerList(param)); // Оставляем для совместимости со старым вариантом
if (target.isEmpty() && !param.hasAnyParam(PlayerSelectors.getAllKeys())) target.add(senderPlayer);
for (int i = 0; i < repeat; i++) {
Bukkit.getScheduler().runTaskLater(plg(), new Runnable() {
@Override
public void run() {
for (Player player : target) {
if (Activators.isStopped(player, id, true)) continue;
ExecEvent ce = new ExecEvent(senderPlayer, player, id, tempVars);
Bukkit.getServer().getPluginManager().callEvent(ce);
}
}
}, delay * repeat);
}
return true;
}
// Plate Event
public static boolean raisePlateEvent(PlayerInteractEvent event) {
if (event.getAction() != Action.PHYSICAL) return false;
if (!((event.getClickedBlock().getType() == Material.WOOD_PLATE) || (event.getClickedBlock().getType() == Material.STONE_PLATE)))
return false;
final Player p = event.getPlayer();
final Location l = event.getClickedBlock().getLocation();
Bukkit.getScheduler().runTaskLater(plg(), new Runnable() {
@Override
public void run() {
PlateEvent pe = new PlateEvent(p, l);
Bukkit.getServer().getPluginManager().callEvent(pe);
}
}, 1);
return false;
}
public static void raiseAllRegionEvents(final Player player, final Location to, final Location from) {
if (!RAWorldGuard.isConnected()) return;
Bukkit.getScheduler().runTaskLaterAsynchronously(ReActions.instance, new Runnable() {
@Override
public void run() {
final List<String> regionsTo = RAWorldGuard.getRegions(to);
final List<String> regionsFrom = RAWorldGuard.getRegions(from);
Bukkit.getScheduler().runTask(ReActions.instance, new Runnable() {
@Override
public void run() {
raiseRegionEvent(player, regionsTo);
raiseRgEnterEvent(player, regionsTo, regionsFrom);
raiseRgLeaveEvent(player, regionsTo, regionsFrom);
}
});
}
}, 1);
}
private static void raiseRgEnterEvent(Player player, List<String> regionTo, List<String> regionFrom) {
if (regionTo.isEmpty()) return;
for (String rg : regionTo)
if (!regionFrom.contains(rg)) {
RegionEnterEvent wge = new RegionEnterEvent(player, rg);
Bukkit.getServer().getPluginManager().callEvent(wge);
}
}
private static void raiseRgLeaveEvent(Player player, List<String> regionTo, List<String> regionFrom) {
if (regionFrom.isEmpty()) return;
for (String rg : regionFrom)
if (!regionTo.contains(rg)) {
RegionLeaveEvent wge = new RegionLeaveEvent(player, rg);
Bukkit.getServer().getPluginManager().callEvent(wge);
}
}
private static void raiseRegionEvent(Player player, List<String> to) {
if (to.isEmpty()) return;
for (String region : to) {
setFutureRegionCheck(player.getName(), region, false);
}
}
private static void setFutureRegionCheck(final String playerName, final String region, boolean repeat) {
@SuppressWarnings("deprecation")
Player player = Bukkit.getPlayerExact(playerName);
if (player == null) return;
if (!player.isOnline()) return;
if (player.isDead()) return;
if (!RAWorldGuard.isPlayerInRegion(player, region)) return;
String rg = "rg-" + region;
if (!isTimeToRaiseEvent(player, rg, Cfg.worlduardRecheck, repeat)) return;
RegionEvent wge = new RegionEvent(player, region);
Bukkit.getServer().getPluginManager().callEvent(wge);
Bukkit.getScheduler().runTaskLater(plg(), new Runnable() {
@Override
public void run() {
setFutureRegionCheck(playerName, region, true);
}
}, 20 * Cfg.worlduardRecheck);
}
private static void setFutureItemWearCheck(final String playerName, final String itemStr, boolean repeat) {
@SuppressWarnings("deprecation")
Player player = Bukkit.getPlayerExact(playerName);
if (player == null) return;
if (!player.isOnline()) return;
String rg = "iw-" + itemStr;
if (!isTimeToRaiseEvent(player, rg, Cfg.itemWearRecheck, repeat)) return;
ItemWearEvent iwe = new ItemWearEvent(player);
if (!iwe.isItemWeared(itemStr)) return;
Bukkit.getServer().getPluginManager().callEvent(iwe);
Bukkit.getScheduler().runTaskLater(plg(), new Runnable() {
@Override
public void run() {
setFutureItemWearCheck(playerName, itemStr, true);
}
}, 20 * Cfg.itemWearRecheck);
}
public static void raiseItemWearEvent(Player player) {
final String playerName = player.getName();
Bukkit.getScheduler().runTaskLater(plg(), new Runnable() {
@Override
public void run() {
for (ItemWearActivator iw : Activators.getItemWearActivatos())
setFutureItemWearCheck(playerName, iw.getItemStr(), false);
}
}, 1);
}
public static void raiseItemHoldEvent(Player player) {
final String playerName = player.getName();
Bukkit.getScheduler().runTaskLater(plg(), new Runnable() {
@Override
public void run() {
for (ItemHoldActivator ih : Activators.getItemHoldActivatos())
setFutureItemHoldCheck(playerName, ih.getItemStr(), false);
}
}, 1);
}
private static boolean setFutureItemHoldCheck(final String playerName, final String itemStr, boolean repeat) {
@SuppressWarnings("deprecation")
Player player = Bukkit.getPlayerExact(playerName);
if (player == null || !player.isOnline() || player.isDead()) return false;
ItemStack itemInHand = BukkitCompatibilityFix.getItemInHand(player);
if (itemInHand == null || itemInHand.getType() == Material.AIR) return false;
String rg = "ih-" + itemStr;
if (!isTimeToRaiseEvent(player, rg, Cfg.itemHoldRecheck, repeat)) return false;
if (!ItemUtil.compareItemStr(itemInHand, itemStr)) return false;
ItemHoldEvent ihe = new ItemHoldEvent(player);
Bukkit.getServer().getPluginManager().callEvent(ihe);
Bukkit.getScheduler().runTaskLater(plg(), new Runnable() {
@Override
public void run() {
setFutureItemHoldCheck(playerName, itemStr, true);
}
}, 20 * Cfg.itemHoldRecheck);
return true;
}
public static boolean isTimeToRaiseEvent(Player p, String id, int seconds, boolean repeat) {
Long curtime = System.currentTimeMillis();
Long prevtime = p.hasMetadata("reactions-rchk-" + id) ? p.getMetadata("reactions-rchk-" + id).get(0).asLong() : 0;
boolean needUpdate = repeat || ((curtime - prevtime) >= (1000 * seconds));
if (needUpdate) p.setMetadata("reactions-rchk-" + id, new FixedMetadataValue(plg(), curtime));
return needUpdate;
}
public static boolean raiseMessageEvent(CommandSender sender, MessageActivator.Source source, String message) {
Player player = sender != null && (sender instanceof Player) ? (Player) sender : null;
for (MessageActivator a : Activators.getMessageActivators()) {
if (a.filterMessage(source, message)) {
MessageEvent me = new MessageEvent(player, a, message);
Bukkit.getServer().getPluginManager().callEvent(me);
return me.isCancelled();
}
}
return false;
}
public static void raiseVariableEvent(String var, String playerName, String newValue, String prevValue) {
if (newValue.equalsIgnoreCase(prevValue)) return;
@SuppressWarnings("deprecation")
Player player = Bukkit.getPlayerExact(playerName);
if (!playerName.isEmpty() && player == null) return;
VariableEvent ve = new VariableEvent(player, var, newValue, prevValue);
Bukkit.getServer().getPluginManager().callEvent(ve);
}
public static boolean raiseMobDamageEvent(EntityDamageEvent event, Player damager) {
if (damager == null) return false;
if (!(event.getEntity() instanceof LivingEntity)) return false;
double damage = BukkitCompatibilityFix.getEventDamage(event);
MobDamageEvent mde = new MobDamageEvent((LivingEntity) event.getEntity(), damager, damage, event.getCause());
Bukkit.getServer().getPluginManager().callEvent(mde);
BukkitCompatibilityFix.setEventDamage(event, mde.getDamage());
return mde.isCancelled();
}
public static void raiseQuitEvent(PlayerQuitEvent event) {
QuitEvent qu = new QuitEvent(event.getPlayer(), event.getQuitMessage());
Bukkit.getServer().getPluginManager().callEvent(qu);
event.setQuitMessage(qu.getQuitMessage() == null || qu.getQuitMessage().isEmpty() ? null : ChatColor.translateAlternateColorCodes('&', qu.getQuitMessage()));
}
public static boolean raiseBlockClickEvent(PlayerInteractEvent event) {
Boolean leftClick;
if (event.getAction() == Action.RIGHT_CLICK_BLOCK) leftClick = false;
else if (event.getAction() == Action.LEFT_CLICK_BLOCK) leftClick = true;
else return false;
BlockClickEvent e = new BlockClickEvent(event.getPlayer(), event.getClickedBlock(), leftClick);
Bukkit.getServer().getPluginManager().callEvent(e);
return e.isCancelled();
}
public static boolean raiseInventoryClickEvent(InventoryClickEvent event) {
Player p = (Player) event.getWhoClicked();
PlayerInventoryClickEvent e = new PlayerInventoryClickEvent(p, event.getAction(), event.getClick(), event.getInventory(), event.getSlotType(), event.getCurrentItem(), event.getHotbarButton());
Bukkit.getServer().getPluginManager().callEvent(e);
return e.isCancelled();
}
public static boolean raiseDropEvent(PlayerDropItemEvent event) {
Item item = event.getItemDrop();
double pickupDelay = BukkitCompatibilityFix.getItemPickupDelay(item);
DropEvent e = new DropEvent(event.getPlayer(), event.getItemDrop(), pickupDelay);
Bukkit.getServer().getPluginManager().callEvent(e);
BukkitCompatibilityFix.setItemPickupDelay(item, e.getPickupDelay());
return e.isCancelled();
}
public static boolean raiseFlightEvent(PlayerToggleFlightEvent event) {
FlightEvent e = new FlightEvent(event.getPlayer(), event.isFlying());
Bukkit.getServer().getPluginManager().callEvent(e);
return e.isCancelled();
}
public static boolean raiseEntityClickEvent(PlayerInteractEntityEvent event) {
EntityClickEvent e = new EntityClickEvent(event.getPlayer(), event.getRightClicked());
Bukkit.getServer().getPluginManager().callEvent(e);
return e.isCancelled();
}
public static boolean raiseBlockBreakEvent(BlockBreakEvent event) {
PlayerBlockBreakEvent e = new PlayerBlockBreakEvent(event.getPlayer(), event.getBlock());
Bukkit.getServer().getPluginManager().callEvent(e);
return e.isCancelled();
}
}