Added TalismanEquipEvent

This commit is contained in:
Auxilor
2021-01-07 12:02:08 +00:00
parent bb4e8c9db8
commit 124530bd46
7 changed files with 178 additions and 10 deletions

View File

@@ -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)
);
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -0,0 +1,6 @@
package com.willfp.talismans.talismans.util.equipevent;
public enum EquipType {
EQUIP,
UNEQUIP
}

View File

@@ -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;
}
}

View File

@@ -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));
}
}
}