Added TalismanEquipEvent
This commit is contained in:
@@ -20,6 +20,7 @@ import com.willfp.talismans.talismans.util.BlockPlaceListener;
|
||||
import com.willfp.talismans.talismans.util.TalismanChecks;
|
||||
import com.willfp.talismans.talismans.util.TalismanCraftListener;
|
||||
import com.willfp.talismans.talismans.util.WatcherTriggers;
|
||||
import com.willfp.talismans.talismans.util.equipevent.TalismanEquipEventListeners;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
@@ -147,7 +148,8 @@ public class TalismansPlugin extends AbstractEcoPlugin {
|
||||
return Arrays.asList(
|
||||
new WatcherTriggers(this),
|
||||
new BlockPlaceListener(),
|
||||
new TalismanCraftListener()
|
||||
new TalismanCraftListener(),
|
||||
new TalismanEquipEventListeners(this)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ import java.util.UUID;
|
||||
|
||||
@UtilityClass
|
||||
public class TalismanChecks {
|
||||
private static final Map<UUID, Set<Talisman>> CACHED_TALISMANS = Collections.synchronizedMap(new HashMap<>());
|
||||
public static final Map<UUID, Set<Talisman>> CACHED_TALISMANS = Collections.synchronizedMap(new HashMap<>());
|
||||
private static boolean readEnderChest = true;
|
||||
private static boolean readShulkerBoxes = true;
|
||||
private static final AbstractEcoPlugin PLUGIN = AbstractEcoPlugin.getInstance();
|
||||
@@ -100,9 +100,23 @@ public class TalismanChecks {
|
||||
* @return A set of all found talismans.
|
||||
*/
|
||||
public static Set<Talisman> getTalismansOnPlayer(@NotNull final Player player) {
|
||||
Set<Talisman> cached = CACHED_TALISMANS.get(player.getUniqueId());
|
||||
if (cached != null) {
|
||||
return cached;
|
||||
return getTalismansOnPlayer(player, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all talismans that a player has active.
|
||||
*
|
||||
* @param player The player to query.
|
||||
* @param useCache If the cache should be checked.
|
||||
* @return A set of all found talismans.
|
||||
*/
|
||||
public static Set<Talisman> getTalismansOnPlayer(@NotNull final Player player,
|
||||
final boolean useCache) {
|
||||
if (useCache) {
|
||||
Set<Talisman> cached = CACHED_TALISMANS.get(player.getUniqueId());
|
||||
if (cached != null) {
|
||||
return cached;
|
||||
}
|
||||
}
|
||||
|
||||
List<ItemStack> contents = new ArrayList<>();
|
||||
@@ -140,8 +154,10 @@ public class TalismanChecks {
|
||||
found.add(talisman);
|
||||
}
|
||||
|
||||
CACHED_TALISMANS.put(player.getUniqueId(), found);
|
||||
PLUGIN.getScheduler().runLater(() -> CACHED_TALISMANS.remove(player.getUniqueId()), 40);
|
||||
if (useCache) {
|
||||
CACHED_TALISMANS.put(player.getUniqueId(), found);
|
||||
PLUGIN.getScheduler().runLater(() -> CACHED_TALISMANS.remove(player.getUniqueId()), 40);
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@ public class WatcherTriggers extends PluginDependent implements Listener {
|
||||
|
||||
Player shooter = (Player) event.getEntity().getShooter();
|
||||
|
||||
TalismanChecks.getTalismansOnPlayer(shooter).forEach(talisman-> {
|
||||
TalismanChecks.getTalismansOnPlayer(shooter).forEach(talisman -> {
|
||||
if (!talisman.isEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
package com.willfp.talismans.talismans.util.equipevent;
|
||||
|
||||
public enum EquipType {
|
||||
EQUIP,
|
||||
UNEQUIP
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package com.willfp.talismans.talismans.util.equipevent;
|
||||
|
||||
import com.willfp.talismans.talismans.Talisman;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.player.PlayerEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class TalismanEquipEvent extends PlayerEvent {
|
||||
private static final HandlerList HANDLER_LIST = new HandlerList();
|
||||
|
||||
/**
|
||||
* The talisman.
|
||||
*/
|
||||
@Getter
|
||||
private final Talisman talisman;
|
||||
|
||||
/**
|
||||
* If the event is from being equipped or unequipped.
|
||||
*/
|
||||
@Getter
|
||||
private final EquipType type;
|
||||
|
||||
/**
|
||||
* Create a new TalismanEquipEvent.
|
||||
*
|
||||
* @param who The player.
|
||||
* @param talisman The talisman.
|
||||
* @param type The equip type.
|
||||
*/
|
||||
public TalismanEquipEvent(@NotNull final Player who,
|
||||
@NotNull final Talisman talisman,
|
||||
@NotNull final EquipType type) {
|
||||
super(who);
|
||||
this.talisman = talisman;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return HANDLER_LIST;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return HANDLER_LIST;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.willfp.talismans.talismans.util.equipevent;
|
||||
|
||||
import com.willfp.eco.util.internal.PluginDependent;
|
||||
import com.willfp.eco.util.plugin.AbstractEcoPlugin;
|
||||
import com.willfp.talismans.talismans.Talisman;
|
||||
import com.willfp.talismans.talismans.util.TalismanChecks;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityDropItemEvent;
|
||||
import org.bukkit.event.entity.EntityPickupItemEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class TalismanEquipEventListeners extends PluginDependent implements Listener {
|
||||
public TalismanEquipEventListeners(@NotNull final AbstractEcoPlugin plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onItemPickup(@NotNull final EntityPickupItemEvent event) {
|
||||
if (!(event.getEntity() instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getItem().getItemStack().getType() != Material.PLAYER_HEAD) {
|
||||
return;
|
||||
}
|
||||
|
||||
refreshPlayer((Player) event.getEntity());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(@NotNull final PlayerJoinEvent event) {
|
||||
refresh();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerLeave(@NotNull final PlayerQuitEvent event) {
|
||||
refresh();
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryDrop(@NotNull final EntityDropItemEvent event) {
|
||||
if (!(event.getEntity() instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getItemDrop().getItemStack().getType() != Material.PLAYER_HEAD) {
|
||||
return;
|
||||
}
|
||||
|
||||
refreshPlayer((Player) event.getEntity());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInventoryClick(@NotNull final InventoryClickEvent event) {
|
||||
if (!(event.getWhoClicked() instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
refreshPlayer((Player) event.getWhoClicked());
|
||||
}
|
||||
|
||||
private void refresh() {
|
||||
this.getPlugin().getScheduler().runLater(() -> this.getPlugin().getServer().getOnlinePlayers().forEach(this::refreshPlayer), 1);
|
||||
}
|
||||
|
||||
private void refreshPlayer(@NotNull final Player player) {
|
||||
Set<Talisman> inCache = TalismanChecks.CACHED_TALISMANS.get(player.getUniqueId());
|
||||
if (inCache == null) {
|
||||
inCache = new HashSet<>();
|
||||
}
|
||||
|
||||
Set<Talisman> newSet = TalismanChecks.getTalismansOnPlayer(player);
|
||||
|
||||
newSet.removeAll(inCache);
|
||||
for (Talisman talisman : newSet) {
|
||||
Bukkit.getPluginManager().callEvent(new TalismanEquipEvent(player, talisman, EquipType.EQUIP));
|
||||
}
|
||||
|
||||
inCache.removeAll(newSet);
|
||||
for (Talisman talisman : inCache) {
|
||||
Bukkit.getPluginManager().callEvent(new TalismanEquipEvent(player, talisman, EquipType.UNEQUIP));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user