Completed kotlin rewrite

This commit is contained in:
Auxilor
2021-12-06 19:20:32 +00:00
parent a0e88823d3
commit ce0fef520b
4 changed files with 208 additions and 325 deletions

View File

@@ -29,7 +29,7 @@ class TalismansPlugin : EcoPlugin(611, 9865, "&6", true) {
CustomItem(
this.namespacedKeyFactory.create("any_talisman"),
{ test -> TalismanChecks.getTalismanOnItem(test) != null },
Talismans.values()[0].getLevel(1)!!.itemStack
Talismans.values()[0].itemStack
).register()
}

View File

@@ -1,92 +1,50 @@
package com.willfp.talismans.talismans.util;
package com.willfp.talismans.talismans.util
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.updating.ConfigUpdater;
import com.willfp.talismans.TalismansPlugin;
import com.willfp.talismans.talismans.Talisman;
import com.willfp.talismans.talismans.Talismans;
import org.bukkit.block.BlockState;
import org.bukkit.block.ShulkerBox;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.talismans.TalismansPlugin.Companion.instance
import com.willfp.talismans.talismans.Talisman
import com.willfp.talismans.talismans.Talismans.getByID
import com.willfp.talismans.talismans.util.TalismanUtils.convert
import com.willfp.talismans.talismans.util.TalismanUtils.getLimit
import com.willfp.talismans.talismans.util.TalismanUtils.isTalismanMaterial
import org.bukkit.block.ShulkerBox
import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.BlockStateMeta
import org.bukkit.persistence.PersistentDataType
import java.util.*
import java.util.function.Function
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.WeakHashMap;
import java.util.function.Function;
object TalismanChecks {
private val CACHED_TALISMANS = Collections.synchronizedMap(HashMap<UUID, Set<Talisman>>())
private val CACHED_TALISMAN_ITEMS = Collections.synchronizedMap(WeakHashMap<UUID, Set<ItemStack>>())
private val PROVIDERS: MutableSet<Function<Player, List<ItemStack>>> = HashSet()
public class TalismanChecks {
/**
* Cached talismans.
*/
public static final Map<UUID, Set<Talisman>> CACHED_TALISMANS = Collections.synchronizedMap(new HashMap<>());
private var readEnderChest = true
private var readShulkerBoxes = true
private var offhandOnly = false
/**
* Cached items.
*/
public static final Map<UUID, Set<ItemStack>> CACHED_TALISMAN_ITEMS = Collections.synchronizedMap(new WeakHashMap<>());
/**
* All providers.
*/
private static final Set<Function<Player, List<ItemStack>>> PROVIDERS = new HashSet<>();
/**
* If ender chests should be checked.
*/
private static boolean readEnderChest = true;
/**
* If shulker boxes should be read.
*/
private static boolean readShulkerBoxes = true;
/**
* If only offhand should be read.
*/
private static boolean offhandOnly = false;
/**
* Instance of talismans.
*/
private static final EcoPlugin PLUGIN = TalismansPlugin.getInstance();
private val PLUGIN: EcoPlugin = instance
/**
* Does the specified ItemStack have a certain Talisman present?
*
* @param item The {@link ItemStack} to check
* @param item The [ItemStack] to check
* @param talisman The talisman to query
* @return If the item has the queried talisman
*/
public static boolean item(@Nullable final ItemStack item,
@NotNull final Talisman talisman) {
fun item(
item: ItemStack?,
talisman: Talisman
): Boolean {
if (item == null) {
return false;
return false
}
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return false;
}
PersistentDataContainer container = meta.getPersistentDataContainer();
return container.has(talisman.getKey(), PersistentDataType.INTEGER);
val meta = item.itemMeta ?: return false
val container = meta.persistentDataContainer
return container.has(talisman.key, PersistentDataType.INTEGER)
}
/**
@@ -95,30 +53,25 @@ public class TalismanChecks {
* @param item The item to query.
* @return The talisman, or null if no talisman is present.
*/
public static Talisman getTalismanOnItem(@Nullable final ItemStack item) {
fun getTalismanOnItem(item: ItemStack?): Talisman? {
if (item == null) {
return null;
return null
}
if (!TalismanUtils.isTalismanMaterial(item.getType())) {
return null;
if (!isTalismanMaterial(item.type)) {
return null
}
ItemMeta meta = item.getItemMeta();
val meta = item.itemMeta ?: return null
if (meta == null) {
return null;
}
val container = meta.persistentDataContainer
PersistentDataContainer container = meta.getPersistentDataContainer();
String id = container.get(PLUGIN.getNamespacedKeyFactory().create("talisman"), PersistentDataType.STRING);
if (id == null) {
return null;
}
val id = container.get(
PLUGIN.namespacedKeyFactory.create("talisman"),
PersistentDataType.STRING
) ?: return null
Talisman talisman = Talismans.getByID(id);
return talisman;
return getByID(id)
}
/**
@@ -127,11 +80,10 @@ public class TalismanChecks {
* @param player The player to query.
* @return A set of all found talismans.
*/
public static Set<Talisman> getTalismansOnPlayer(@NotNull final Player player) {
return getTalismansOnPlayer(player, true);
fun getTalismansOnPlayer(player: Player): Set<Talisman> {
return getTalismansOnPlayer(player, true)
}
/**
* Get all talismans ItemStacks that a player has active.
*
@@ -140,82 +92,78 @@ public class TalismanChecks {
* @param extra Bonus items.
* @return A set of all found talismans.
*/
public static Set<ItemStack> getTalismanItemsOnPlayer(@NotNull final Player player,
final boolean useCache,
@NotNull final ItemStack... extra) {
fun getTalismanItemsOnPlayer(
player: Player,
useCache: Boolean,
vararg extra: ItemStack?
): Set<ItemStack> {
if (useCache) {
Set<ItemStack> cached = CACHED_TALISMAN_ITEMS.get(player.getUniqueId());
val cached = CACHED_TALISMAN_ITEMS[player.uniqueId]
if (cached != null) {
return cached;
return cached
}
}
List<ItemStack> contents = new ArrayList<>();
List<ItemStack> rawContents = new ArrayList<>(Arrays.asList(player.getInventory().getContents()));
val contents = mutableListOf<ItemStack>()
val rawContents = player.inventory.contents.toMutableList()
if (readEnderChest) {
Inventory enderChest = player.getEnderChest();
val enderChest = player.enderChest as Inventory?
// Not always true, bug reported where it was null.
if (enderChest != null) {
rawContents.addAll(Arrays.asList(enderChest.getContents()));
rawContents.addAll(enderChest.contents)
}
}
if (offhandOnly) {
rawContents.clear();
rawContents.add(player.getInventory().getItemInOffHand());
rawContents.clear()
rawContents.add(player.inventory.itemInOffHand)
}
rawContents.addAll(Arrays.asList(extra));
for (Function<Player, List<ItemStack>> provider : PROVIDERS) {
rawContents.addAll(provider.apply(player));
rawContents.addAll(extra)
for (provider in PROVIDERS) {
rawContents.addAll(provider.apply(player))
}
for (ItemStack rawContent : rawContents) {
for (rawContent in rawContents) {
if (rawContent == null) {
continue;
continue
}
if (readShulkerBoxes) {
ItemMeta meta = rawContent.getItemMeta();
if (meta instanceof BlockStateMeta shulkerMeta) {
val meta = rawContent.itemMeta
if (meta is BlockStateMeta) {
val shulkerMeta = meta
if (!shulkerMeta.hasBlockState()) {
continue;
continue
}
BlockState state = shulkerMeta.getBlockState();
if (state instanceof ShulkerBox shulkerBox) {
contents.addAll(Arrays.asList(shulkerBox.getInventory().getContents()));
continue;
val state = shulkerMeta.blockState
if (state is ShulkerBox) {
contents.addAll(Arrays.asList(*state.inventory.contents))
continue
}
}
}
contents.add(rawContent);
contents.add(rawContent)
}
Set<ItemStack> items = new HashSet<>();
val items: MutableSet<ItemStack> = HashSet()
for (ItemStack itemStack : contents) {
Talisman talisman = getTalismanOnItem(itemStack);
if (talisman == null) {
continue;
for (itemStack in contents) {
convert(itemStack)
getTalismanOnItem(itemStack) ?: continue
if (items.size >= getLimit(player)) {
break
}
if (items.size() >= TalismanUtils.getLimit(player)) {
break;
}
items.add(itemStack);
items.add(itemStack)
}
if (useCache) {
CACHED_TALISMAN_ITEMS.put(player.getUniqueId(), items);
PLUGIN.getScheduler().runLater(() -> CACHED_TALISMAN_ITEMS.remove(player.getUniqueId()), 40);
CACHED_TALISMAN_ITEMS[player.uniqueId] = items
PLUGIN.scheduler.runLater({ CACHED_TALISMAN_ITEMS.remove(player.uniqueId) }, 40)
}
return items;
return items
}
/**
@@ -226,38 +174,35 @@ public class TalismanChecks {
* @param extra Bonus items.
* @return A set of all found talismans.
*/
public static Set<Talisman> getTalismansOnPlayer(@NotNull final Player player,
final boolean useCache,
@NotNull final ItemStack... extra) {
fun getTalismansOnPlayer(
player: Player,
useCache: Boolean,
vararg extra: ItemStack?
): Set<Talisman> {
if (useCache) {
Set<Talisman> cached = CACHED_TALISMANS.get(player.getUniqueId());
val cached = CACHED_TALISMANS[player.uniqueId]
if (cached != null) {
return cached;
return cached
}
}
Set<ItemStack> contents = getTalismanItemsOnPlayer(player, useCache, extra);
Set<Talisman> found = new HashSet<>();
val contents = getTalismanItemsOnPlayer(player, useCache, *extra)
val found: MutableSet<Talisman> = HashSet()
for (ItemStack itemStack : contents) {
Talisman talisman = getTalismanOnItem(itemStack);
if (talisman == null) {
continue;
for (itemStack in contents) {
val talisman = getTalismanOnItem(itemStack) ?: continue
if (found.size >= getLimit(player)) {
break
}
if (found.size() >= TalismanUtils.getLimit(player)) {
break;
}
found.add(talisman);
found.add(talisman)
}
if (useCache) {
CACHED_TALISMANS.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> CACHED_TALISMANS.remove(player.getUniqueId()), 40);
CACHED_TALISMANS[player.uniqueId] = found
PLUGIN.scheduler.runLater({ CACHED_TALISMANS.remove(player.uniqueId) }, 40)
}
return found;
return found
}
/**
@@ -265,9 +210,9 @@ public class TalismanChecks {
*
* @param player The player.
*/
public static void clearCache(@NotNull final Player player) {
CACHED_TALISMAN_ITEMS.remove(player.getUniqueId());
CACHED_TALISMANS.remove(player.getUniqueId());
fun clearCache(player: Player) {
CACHED_TALISMAN_ITEMS.remove(player.uniqueId)
CACHED_TALISMANS.remove(player.uniqueId)
}
/**
@@ -275,8 +220,8 @@ public class TalismanChecks {
*
* @param provider The provider.
*/
public static void regsiterItemStackProvider(@NotNull final Function<Player, List<ItemStack>> provider) {
PROVIDERS.add(provider);
fun regsiterItemStackProvider(provider: Function<Player, List<ItemStack>>) {
PROVIDERS.add(provider)
}
/**
@@ -286,9 +231,11 @@ public class TalismanChecks {
* @param talisman The talisman to search for.
* @return A set of all found talismans.
*/
public static boolean hasTalisman(@NotNull final Player player,
@NotNull final Talisman talisman) {
return getTalismansOnPlayer(player).contains(talisman);
fun hasTalisman(
player: Player,
talisman: Talisman
): Boolean {
return getTalismansOnPlayer(player).contains(talisman)
}
/**
@@ -297,9 +244,9 @@ public class TalismanChecks {
* @param plugin Instance of Talismans.
*/
@ConfigUpdater
public static void reload(@NotNull final EcoPlugin plugin) {
readEnderChest = plugin.getConfigYml().getBool("read-enderchest");
readShulkerBoxes = plugin.getConfigYml().getBool("read-shulkerboxes");
offhandOnly = plugin.getConfigYml().getBool("offhand-only");
fun reload(plugin: EcoPlugin) {
readEnderChest = plugin.configYml.getBool("read-enderchest")
readShulkerBoxes = plugin.configYml.getBool("read-shulkerboxes")
offhandOnly = plugin.configYml.getBool("offhand-only")
}
}
}

View File

@@ -1,140 +1,81 @@
package com.willfp.talismans.talismans.util;
package com.willfp.talismans.talismans.util
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.events.ArmorChangeEvent;
import com.willfp.libreforge.LibReforgeUtils;
import com.willfp.libreforge.effects.ConfiguredEffect;
import com.willfp.talismans.talismans.Talisman;
import com.willfp.talismans.talismans.Talismans;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.jetbrains.annotations.NotNull;
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.events.ArmorChangeEvent
import com.willfp.libreforge.updateEffects
import com.willfp.talismans.talismans.Talismans.values
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityPickupItemEvent
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.event.player.PlayerDropItemEvent
import org.bukkit.event.player.PlayerItemHeldEvent
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerQuitEvent
public class TalismanEnableListeners extends PluginDependent<EcoPlugin> implements Listener {
/**
* Initialize new listeners and link them to a plugin.
*
* @param plugin The plugin to link to.
*/
public TalismanEnableListeners(@NotNull final EcoPlugin plugin) {
super(plugin);
}
/**
* Called on item pickup.
*
* @param event The event to listen for.
*/
class TalismanEnableListeners(private val plugin :EcoPlugin) : Listener {
@EventHandler
public void onItemPickup(@NotNull final EntityPickupItemEvent event) {
if (!(event.getEntity() instanceof Player player)) {
return;
fun onItemPickup(event: EntityPickupItemEvent) {
if (event.entity !is Player) {
return
}
if (!TalismanUtils.isTalismanMaterial(event.getItem().getItemStack().getType())) {
return;
val player = event.entity as Player
if (!TalismanUtils.isTalismanMaterial(event.item.itemStack.type)) {
return
}
refreshPlayer(player);
refreshPlayer(player)
}
/**
* Called on player join.
*
* @param event The event to listen for.
*/
@EventHandler
public void onPlayerJoin(@NotNull final PlayerJoinEvent event) {
refresh();
fun onPlayerJoin(event: PlayerJoinEvent) {
refresh()
}
/**
* Called on player leave.
*
* @param event The event to listen for.
*/
@EventHandler
public void onPlayerLeave(@NotNull final PlayerQuitEvent event) {
refresh();
Player player = event.getPlayer();
for (Talisman talisman : Talismans.values()) {
for (ConfiguredEffect effect : talisman.getEffects()) {
effect.getEffect().disableForPlayer(player);
fun onPlayerLeave(event: PlayerQuitEvent) {
refresh()
val player = event.player
for (talisman in values()) {
for ((effect1) in talisman.effects) {
effect1.disableForPlayer(player)
}
}
}
/**
* Called on item drop.
*
* @param event The event to listen for.
*/
@EventHandler
public void onInventoryDrop(@NotNull final PlayerDropItemEvent event) {
if (!TalismanUtils.isTalismanMaterial(event.getItemDrop().getItemStack().getType())) {
return;
fun onInventoryDrop(event: PlayerDropItemEvent) {
if (!TalismanUtils.isTalismanMaterial(event.itemDrop.itemStack.type)) {
return
}
refreshPlayer(event.getPlayer());
refreshPlayer(event.player)
}
/**
* Called on slot change.
*
* @param event The event to listen for.
*/
@EventHandler
public void onChangeSlot(@NotNull final PlayerItemHeldEvent event) {
refreshPlayer(event.getPlayer());
this.getPlugin().getScheduler().run(() -> refreshPlayer(event.getPlayer()));
fun onChangeSlot(event: PlayerItemHeldEvent) {
refreshPlayer(event.player)
plugin.scheduler.run { refreshPlayer(event.player) }
}
/**
* Called on armor change.
*
* @param event The event to listen for.
*/
@EventHandler
public void onArmorChange(@NotNull final ArmorChangeEvent event) {
refreshPlayer(event.getPlayer());
fun onArmorChange(event: ArmorChangeEvent) {
refreshPlayer(event.player)
}
/**
* Called on inventory click.
*
* @param event The event to listen for.
*/
@EventHandler
public void onInventoryClick(@NotNull final InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player)) {
return;
fun onInventoryClick(event: InventoryClickEvent) {
if (event.whoClicked !is Player) {
return
}
refreshPlayer((Player) event.getWhoClicked());
refreshPlayer(event.whoClicked as Player)
}
/**
* Force refresh all online players.
* <p>
* This is a very expensive method.
*/
public void refresh() {
this.getPlugin().getServer().getOnlinePlayers().forEach(this::refreshPlayer);
private fun refresh() {
plugin.server.onlinePlayers.forEach { player: Player -> refreshPlayer(player) }
}
private void refreshPlayer(@NotNull final Player player) {
TalismanChecks.clearCache(player);
LibReforgeUtils.updateEffects(player);
private fun refreshPlayer(player: Player) {
TalismanChecks.clearCache(player)
player.updateEffects()
}
}
}

View File

@@ -1,61 +1,56 @@
package com.willfp.talismans.talismans.util;
package com.willfp.talismans.talismans.util
import com.willfp.eco.core.EcoPlugin
import com.willfp.talismans.TalismansPlugin.Companion.instance
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.jetbrains.annotations.NotNull;
object TalismanUtils {
private val TALISMAN_MATERIALS = mutableSetOf<Material>()
private val PLUGIN: EcoPlugin = instance
import java.util.HashSet;
import java.util.Set;
fun convert(itemStack: ItemStack?) {
if (itemStack == null) {
return
}
if (!isTalismanMaterial(itemStack.type)) {
return
}
val meta = itemStack.itemMeta ?: return
val container = meta.persistentDataContainer
val talismanKey = container.keys.firstOrNull { it.namespace == "talismans" } ?: return
val level = container.get(talismanKey, PersistentDataType.INTEGER) ?: return
container.remove(talismanKey)
container.set(
PLUGIN.namespacedKeyFactory.create("talisman"),
PersistentDataType.STRING,
talismanKey.key + "_" + level
)
itemStack.itemMeta = meta
}
public class TalismanUtils {
/**
* All valid materials for talismans.
*/
private static final Set<Material> TALISMAN_MATERIALS = new HashSet<>();
/**
* Get limit for talisman reading.
*
* @param player The player to check.
* @return The limit.
*/
public static int getLimit(@NotNull final Player player) {
String prefix = "talismans.limit.";
for (PermissionAttachmentInfo permissionAttachmentInfo : player.getEffectivePermissions()) {
String permission = permissionAttachmentInfo.getPermission();
fun getLimit(player: Player): Int {
val prefix = "talismans.limit."
for (permissionAttachmentInfo in player.effectivePermissions) {
val permission = permissionAttachmentInfo.permission
if (permission.startsWith(prefix)) {
return Integer.parseInt(permission.substring(permission.lastIndexOf(".") + 1));
return permission.substring(permission.lastIndexOf(".") + 1).toInt()
}
}
return 100000;
return 100000
}
/**
* Get if a talisman could exist for a material.
*
* @param material The material.
* @return If possible.
*/
public static boolean isTalismanMaterial(@NotNull final Material material) {
return TALISMAN_MATERIALS.contains(material);
fun isTalismanMaterial(material: Material): Boolean {
return TALISMAN_MATERIALS.contains(material)
}
/**
* Register material as valid for talisman.
*
* @param material The material.
*/
public static void registerTalismanMaterial(@NotNull final Material material) {
TALISMAN_MATERIALS.add(material);
fun registerTalismanMaterial(material: Material) {
TALISMAN_MATERIALS.add(material)
}
/**
* Unregister all materials as valid for talismans.
*/
public static void clearTalismanMaterials() {
TALISMAN_MATERIALS.clear();
fun clearTalismanMaterials() {
TALISMAN_MATERIALS.clear()
}
}
}