Continued kotlin rewrite

This commit is contained in:
Auxilor
2021-12-06 19:07:16 +00:00
parent afa5d10234
commit 8490877232
7 changed files with 207 additions and 377 deletions

View File

@@ -1,166 +0,0 @@
package com.willfp.talismans.command;
import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.TabCompleteHandler;
import com.willfp.eco.core.command.impl.Subcommand;
import com.willfp.talismans.talismans.Talisman;
import com.willfp.talismans.talismans.TalismanLevel;
import com.willfp.talismans.talismans.Talismans;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class CommandGive extends Subcommand {
/**
* The cached numbers.
*/
private static final List<String> NUMBERS = Arrays.asList(
"1",
"2",
"3",
"4",
"5",
"10",
"32",
"64"
);
/**
* Instantiate a new command handler.
*
* @param plugin The plugin for the commands to listen for.
*/
public CommandGive(@NotNull final EcoPlugin plugin) {
super(plugin, "give", "talismans.command.give", false);
}
@Override
public CommandHandler getHandler() {
return (sender, args) -> {
if (args.isEmpty()) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-player"));
return;
}
if (args.size() == 1) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("needs-talisman"));
return;
}
int level = 1;
if (args.size() > 2) {
try {
level = Integer.parseInt(args.get(2));
} catch (NumberFormatException ignored) {
// do nothing
}
}
int amount = 1;
if (args.size() > 3) {
try {
amount = Integer.parseInt(args.get(3));
} catch (NumberFormatException ignored) {
// do nothing
}
}
String recieverName = args.get(0);
Player reciever = Bukkit.getPlayer(recieverName);
if (reciever == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-player"));
return;
}
String talismanName = args.get(1);
Talisman talisman = Talismans.getByID(talismanName);
if (talisman == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-talisman"));
return;
}
TalismanLevel talismanLevel = talisman.getLevel(level);
if (talismanLevel == null) {
sender.sendMessage(this.getPlugin().getLangYml().getMessage("invalid-level"));
return;
}
String message = this.getPlugin().getLangYml().getMessage("give-success");
message = message.replace("%talisman%", talismanLevel.getName()).replace("%recipient%", reciever.getName());
sender.sendMessage(message);
ItemStack itemStack = talismanLevel.getItemStack();
itemStack.setAmount(amount);
reciever.getInventory().addItem(itemStack);
};
}
@Override
public TabCompleteHandler getTabCompleter() {
return (sender, args) -> {
List<String> completions = new ArrayList<>();
if (args.isEmpty()) {
// Currently, this case is not ever reached
return Talismans.values().stream().map(Talisman::getId).collect(Collectors.toList());
}
if (args.size() == 1) {
StringUtil.copyPartialMatches(args.get(0), Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()), completions);
return completions;
}
if (args.size() == 2) {
StringUtil.copyPartialMatches(args.get(1), Talismans.values().stream().map(Talisman::getId).collect(Collectors.toList()), completions);
Collections.sort(completions);
return completions;
}
if (args.size() == 3) {
Talisman talisman = Talismans.getByID(args.get(1).toLowerCase());
if (talisman == null) {
return new ArrayList<>();
}
List<String> levels = talisman.getLevels().stream().map(TalismanLevel::getLevel).map(String::valueOf).collect(Collectors.toList());
StringUtil.copyPartialMatches(args.get(2), levels, completions);
completions.sort((s1, s2) -> {
int t1 = Integer.parseInt(s1);
int t2 = Integer.parseInt(s2);
return t1 - t2;
});
return completions;
}
if (args.size() == 4) {
StringUtil.copyPartialMatches(args.get(3), NUMBERS, completions);
completions.sort((s1, s2) -> {
int t1 = Integer.parseInt(s1);
int t2 = Integer.parseInt(s2);
return t1 - t2;
});
return completions;
}
return new ArrayList<>(0);
};
}
}

View File

@@ -0,0 +1,108 @@
package com.willfp.talismans.command
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.CommandHandler
import com.willfp.eco.core.command.TabCompleteHandler
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.talismans.talismans.Talismans
import com.willfp.talismans.talismans.Talismans.getByID
import org.bukkit.Bukkit
import org.bukkit.util.StringUtil
class CommandGive(plugin: EcoPlugin) : Subcommand(plugin, "reload", "talismans.commands.reload", false) {
private val numbers = listOf(
"1",
"2",
"3",
"4",
"5",
"10",
"32",
"64"
)
override fun getHandler(): CommandHandler? {
return CommandHandler { sender, args ->
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return@CommandHandler
}
if (args.size == 1) {
sender.sendMessage(plugin.langYml.getMessage("needs-talisman"))
return@CommandHandler
}
var amount = 1
if (args.size > 2) {
amount = args[2].toIntOrNull() ?: 1
}
val recieverName = args[0]
val reciever = Bukkit.getPlayer(recieverName)
if (reciever == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return@CommandHandler
}
val talismanName = args[1]
val talisman = getByID(talismanName)
if (talisman == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-talisman"))
return@CommandHandler
}
var message = plugin.langYml.getMessage("give-success")
message = message.replace("%talisman%", talisman.name).replace("%recipient%", reciever.name)
sender.sendMessage(message)
val itemStack = talisman.itemStack
itemStack.amount = amount
reciever.inventory.addItem(itemStack)
}
}
override fun getTabCompleter(): TabCompleteHandler {
return TabCompleteHandler { _, args ->
val completions = mutableListOf<String>()
if (args.isEmpty()) {
return@TabCompleteHandler Talismans.values().map { it.id }
}
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[0],
Bukkit.getOnlinePlayers().map { it.name },
completions
)
}
if (args.size == 2) {
StringUtil.copyPartialMatches(
args[1],
Talismans.values().map { it.id },
completions
)
}
if (args.size == 3) {
StringUtil.copyPartialMatches(
args[2],
numbers,
completions
)
}
completions
}
}
}

View File

@@ -1,42 +1,101 @@
package com.willfp.talismans.talismans
import com.google.common.collect.ImmutableSet
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.display.Display
import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe
import com.willfp.eco.util.StringUtils
import com.willfp.libreforge.Holder
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import com.willfp.talismans.TalismansPlugin
import com.willfp.talismans.talismans.util.TalismanChecks
import com.willfp.talismans.talismans.util.TalismanUtils
import org.apache.commons.lang.Validate
import org.apache.commons.lang.WordUtils
import org.bukkit.Bukkit
import org.bukkit.NamespacedKey
import org.bukkit.inventory.ItemStack
import org.bukkit.permissions.Permission
import org.bukkit.permissions.PermissionDefault
import org.bukkit.persistence.PersistentDataType
import java.util.*
class Talisman(
private val config: Config,
private val plugin: TalismansPlugin
) {
) : Holder {
val id = config.getString("id")
val key: NamespacedKey = plugin.namespacedKeyFactory.create(id)
private val levels: MutableMap<Int, TalismanLevel> = HashMap()
val name = config.getString("name")
val description = config.getString("description")
val formattedDescription: List<String> =
WordUtils.wrap(description, plugin.configYml.getInt("description.wrap"), "\n", false)
.split("[\\r\\n]+")
.toTypedArray()
.map { "${Display.PREFIX}${StringUtils.format(plugin.langYml.getString("description-color"))}$it" }
val itemStack: ItemStack = run {
val item = Items.lookup(config.getString("item"))
Validate.isTrue(item !is EmptyTestableItem, "Item specified in " + key.key + " is invalid!")
TalismanUtils.registerTalismanMaterial(item.item.type)
val out = ItemStackBuilder(item.item)
.setAmount(1)
.writeMetaKey(plugin.namespacedKeyFactory.create("talisman"), PersistentDataType.STRING, id)
.build()
Display.display(out)
}
val craftable = config.getBool("craftable")
val recipe: ShapedCraftingRecipe? = run {
if (craftable) {
val builder = ShapedCraftingRecipe.builder(plugin, key.key)
.setOutput(itemStack)
val recipeStrings = config.getStrings("recipe")
for (i in recipeStrings.indices) {
builder.setRecipePart(i, Items.lookup(recipeStrings[i]))
}
builder.build()
} else null
}.apply { this?.register() }
val customItem = CustomItem(
key,
{ test -> TalismanChecks.getTalismanOnItem(test) == this },
itemStack
).apply { register() }
override val effects = config.getSubsections("effects").mapNotNull {
Effects.compile(it, "Talisman ID ${net.minecraft.server.v1_16_R3.Items.id}")
}.toSet()
override val conditions = config.getSubsections("conditions").mapNotNull {
Conditions.compile(it, "Talisman ID ${net.minecraft.server.v1_16_R3.Items.id}")
}.toSet()
init {
Talismans.addNewTalisman(this)
update()
}
private fun update() {
levels.clear()
var i = 1
for (config in config.getSubsections("levels")) {
val level = TalismanLevel(this, i, config, plugin)
levels[i] = level
i++
if (Bukkit.getPluginManager().getPermission("talismans.fromtable." + key.key) == null) {
val permission = Permission(
"talismans.fromtable." + key.key,
"Allows getting " + key.key + " from a Crafting Table",
PermissionDefault.TRUE
)
permission.addParent(
Bukkit.getPluginManager().getPermission("talismans.fromtable.*")!!,
true
)
Bukkit.getPluginManager().addPermission(permission)
}
}
fun getLevel(level: Int): TalismanLevel? {
return levels[level]
}
fun getLevels(): Set<TalismanLevel> {
return ImmutableSet.copyOf(levels.values)
Talismans.addNewTalisman(this)
}
override fun equals(o: Any?): Boolean {

View File

@@ -1,112 +0,0 @@
package com.willfp.talismans.talismans
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.display.Display
import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe
import com.willfp.eco.util.StringUtils
import com.willfp.libreforge.Holder
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import com.willfp.talismans.TalismansPlugin
import com.willfp.talismans.talismans.util.TalismanChecks
import com.willfp.talismans.talismans.util.TalismanUtils
import net.minecraft.server.v1_16_R3.Items.id
import org.apache.commons.lang.Validate
import org.apache.commons.lang.WordUtils
import org.bukkit.Bukkit
import org.bukkit.NamespacedKey
import org.bukkit.inventory.ItemStack
import org.bukkit.permissions.Permission
import org.bukkit.permissions.PermissionDefault
import org.bukkit.persistence.PersistentDataType
import java.util.*
class TalismanLevel(
val talisman: Talisman,
val level: Int,
private val config: Config,
private val plugin: TalismansPlugin
): Holder {
val key: NamespacedKey = plugin.namespacedKeyFactory.create(talisman.key.key + "_" + level)
val name = config.getString("name")
val description = config.getString("description")
val formattedDescription: List<String> =
WordUtils.wrap(description, plugin.configYml.getInt("description.wrap"), "\n", false)
.split("[\\r\\n]+")
.toTypedArray()
.map { "${Display.PREFIX}${StringUtils.format(plugin.langYml.getString("description-color"))}$it" }
val itemStack: ItemStack = run {
val item = Items.lookup(config.getString("item"))
Validate.isTrue(item !is EmptyTestableItem, "Item specified in " + key.key + " is invalid!")
TalismanUtils.registerTalismanMaterial(item.item.type)
val out = ItemStackBuilder(item.item)
.setAmount(1)
.writeMetaKey(talisman.key, PersistentDataType.INTEGER, level)
.build()
Display.display(out)
}
val craftable = config.getBool("craftable")
val recipe: ShapedCraftingRecipe? = run {
if (craftable) {
val builder = ShapedCraftingRecipe.builder(plugin, key.key)
.setOutput(itemStack)
val recipeStrings = config.getStrings("recipe")
for (i in recipeStrings.indices) {
builder.setRecipePart(i, Items.lookup(recipeStrings[i]))
}
builder.build()
} else null
}.apply { this?.register() }
val customItem = CustomItem(
key,
{ test -> TalismanChecks.getTalismanOnItem(test) == this },
itemStack
).apply { register() }
override val effects = config.getSubsections("effects").mapNotNull {
Effects.compile(it, "Talisman ID $id")
}.toSet()
override val conditions = config.getSubsections("conditions").mapNotNull {
Conditions.compile(it, "Talisman ID $id")
}.toSet()
init {
if (Bukkit.getPluginManager().getPermission("talismans.fromtable." + key.key) == null) {
val permission = Permission(
"talismans.fromtable." + key.key,
"Allows getting " + key.key + " from a Crafting Table",
PermissionDefault.TRUE
)
permission.addParent(
Objects.requireNonNull(
Bukkit.getPluginManager().getPermission("talismans.fromtable.*")
), true
)
Bukkit.getPluginManager().addPermission(permission)
}
}
override fun equals(other: Any?): Boolean {
if (other !is TalismanLevel) {
return false
}
return other.level == this.level && other.talisman == this.talisman
}
override fun hashCode(): Int {
return Objects.hash(level, talisman)
}
}

View File

@@ -4,9 +4,7 @@ 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.TalismanLevel;
import com.willfp.talismans.talismans.Talismans;
import org.bukkit.NamespacedKey;
import org.bukkit.block.BlockState;
import org.bukkit.block.ShulkerBox;
import org.bukkit.entity.Player;
@@ -35,7 +33,7 @@ public class TalismanChecks {
/**
* Cached talismans.
*/
public static final Map<UUID, Set<TalismanLevel>> CACHED_TALISMANS = Collections.synchronizedMap(new HashMap<>());
public static final Map<UUID, Set<Talisman>> CACHED_TALISMANS = Collections.synchronizedMap(new HashMap<>());
/**
* Cached items.
@@ -62,11 +60,6 @@ public class TalismanChecks {
*/
private static boolean offhandOnly = false;
/**
* If only the highest level talismans should be activated.
*/
private static boolean highestLevelOnly = false;
/**
* Instance of talismans.
*/
@@ -102,7 +95,7 @@ public class TalismanChecks {
* @param item The item to query.
* @return The talisman, or null if no talisman is present.
*/
public static TalismanLevel getTalismanOnItem(@Nullable final ItemStack item) {
public static Talisman getTalismanOnItem(@Nullable final ItemStack item) {
if (item == null) {
return null;
}
@@ -118,21 +111,14 @@ public class TalismanChecks {
}
PersistentDataContainer container = meta.getPersistentDataContainer();
NamespacedKey talismanKey = container.getKeys().stream().filter(namespacedKey -> namespacedKey.getNamespace().equals("talismans")).findFirst().orElse(null);
if (talismanKey == null) {
String id = container.get(PLUGIN.getNamespacedKeyFactory().create("talisman"), PersistentDataType.STRING);
if (id == null) {
return null;
}
Integer level = container.get(talismanKey, PersistentDataType.INTEGER);
assert level != null;
Talisman talisman = Talismans.getByID(id);
Talisman talisman = Talismans.getByID(talismanKey.getKey());
if (talisman == null) {
return null;
}
return talisman.getLevel(level);
return talisman;
}
/**
@@ -141,7 +127,7 @@ public class TalismanChecks {
* @param player The player to query.
* @return A set of all found talismans.
*/
public static Set<TalismanLevel> getTalismansOnPlayer(@NotNull final Player player) {
public static Set<Talisman> getTalismansOnPlayer(@NotNull final Player player) {
return getTalismansOnPlayer(player, true);
}
@@ -155,8 +141,8 @@ public class TalismanChecks {
* @return A set of all found talismans.
*/
public static Set<ItemStack> getTalismanItemsOnPlayer(@NotNull final Player player,
final boolean useCache,
@NotNull final ItemStack... extra) {
final boolean useCache,
@NotNull final ItemStack... extra) {
if (useCache) {
Set<ItemStack> cached = CACHED_TALISMAN_ITEMS.get(player.getUniqueId());
if (cached != null) {
@@ -212,7 +198,7 @@ public class TalismanChecks {
Set<ItemStack> items = new HashSet<>();
for (ItemStack itemStack : contents) {
TalismanLevel talisman = getTalismanOnItem(itemStack);
Talisman talisman = getTalismanOnItem(itemStack);
if (talisman == null) {
continue;
}
@@ -240,21 +226,21 @@ public class TalismanChecks {
* @param extra Bonus items.
* @return A set of all found talismans.
*/
public static Set<TalismanLevel> getTalismansOnPlayer(@NotNull final Player player,
public static Set<Talisman> getTalismansOnPlayer(@NotNull final Player player,
final boolean useCache,
@NotNull final ItemStack... extra) {
if (useCache) {
Set<TalismanLevel> cached = CACHED_TALISMANS.get(player.getUniqueId());
Set<Talisman> cached = CACHED_TALISMANS.get(player.getUniqueId());
if (cached != null) {
return cached;
}
}
Set<ItemStack> contents = getTalismanItemsOnPlayer(player, useCache, extra);
Set<TalismanLevel> found = new HashSet<>();
Set<Talisman> found = new HashSet<>();
for (ItemStack itemStack : contents) {
TalismanLevel talisman = getTalismanOnItem(itemStack);
Talisman talisman = getTalismanOnItem(itemStack);
if (talisman == null) {
continue;
}
@@ -266,26 +252,6 @@ public class TalismanChecks {
found.add(talisman);
}
if (highestLevelOnly) {
Map<Talisman, Integer> highestFound = new HashMap<>();
Set<TalismanLevel> foundClone = new HashSet<>(found);
found.clear();
for (TalismanLevel talismanLevel : foundClone) {
Integer highestLevel = highestFound.get(talismanLevel.getTalisman());
if (highestLevel != null) {
if (highestLevel < talismanLevel.getLevel()) {
found.remove(talismanLevel.getTalisman().getLevel(highestLevel));
highestFound.put(talismanLevel.getTalisman(), talismanLevel.getLevel());
found.add(talismanLevel);
}
} else {
found.add(talismanLevel);
highestFound.put(talismanLevel.getTalisman(), talismanLevel.getLevel());
}
}
}
if (useCache) {
CACHED_TALISMANS.put(player.getUniqueId(), found);
PLUGIN.getScheduler().runLater(() -> CACHED_TALISMANS.remove(player.getUniqueId()), 40);
@@ -322,26 +288,7 @@ public class TalismanChecks {
*/
public static boolean hasTalisman(@NotNull final Player player,
@NotNull final Talisman talisman) {
return getTalismanLevel(player, talisman) != null;
}
/**
* Get the level of a talisman that a player has equipped.
*
* @param player The player.
* @param talisman The talisman.
* @return The level, or null if not active.
*/
@Nullable
public static TalismanLevel getTalismanLevel(@NotNull final Player player,
@NotNull final Talisman talisman) {
for (TalismanLevel talismanLevel : getTalismansOnPlayer(player)) {
if (talismanLevel.getTalisman().equals(talisman)) {
return talismanLevel;
}
}
return null;
return getTalismansOnPlayer(player).contains(talisman);
}
/**
@@ -354,6 +301,5 @@ public class TalismanChecks {
readEnderChest = plugin.getConfigYml().getBool("read-enderchest");
readShulkerBoxes = plugin.getConfigYml().getBool("read-shulkerboxes");
offhandOnly = plugin.getConfigYml().getBool("offhand-only");
highestLevelOnly = plugin.getConfigYml().getBool("highest-level-only");
}
}

View File

@@ -6,7 +6,6 @@ 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.TalismanLevel;
import com.willfp.talismans.talismans.Talismans;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -68,11 +67,9 @@ public class TalismanEnableListeners extends PluginDependent<EcoPlugin> implemen
Player player = event.getPlayer();
for (Talisman value : Talismans.values()) {
for (TalismanLevel level : value.getLevels()) {
for (ConfiguredEffect effect : level.getEffects()) {
effect.getEffect().disableForPlayer(player);
}
for (Talisman talisman : Talismans.values()) {
for (ConfiguredEffect effect : talisman.getEffects()) {
effect.getEffect().disableForPlayer(player);
}
}
}

View File

@@ -14,5 +14,3 @@ read-enderchest: true # If a player's ender chest should be checked for talisman
read-shulkerboxes: true # If a player's shulker boxes should be checked for talismans
offhand-only: false # If talismans or shulkers of talismans need to be in the offhand to work
highest-level-only: false # If only the highest level talisman is activated rather than different levels stacking.