From fbf6b2edd9fbc202cc8fff15ceb86d5c2edbd27b Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sat, 5 Feb 2022 17:05:18 +0000 Subject: [PATCH] Added equipment arg parser --- .../entities/EntityArgParserEquipment.kt | 62 +++++++++++++++++++ .../eco/internal/spigot/EcoSpigotPlugin.kt | 2 + 2 files changed, 64 insertions(+) create mode 100644 eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/entities/EntityArgParserEquipment.kt diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/entities/EntityArgParserEquipment.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/entities/EntityArgParserEquipment.kt new file mode 100644 index 00000000..b7593d65 --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/entities/EntityArgParserEquipment.kt @@ -0,0 +1,62 @@ +package com.willfp.eco.internal.entities + +import com.willfp.eco.core.entities.args.EntityArgParseResult +import com.willfp.eco.core.entities.args.EntityArgParser +import com.willfp.eco.core.items.Items +import com.willfp.eco.core.items.TestableItem +import org.bukkit.entity.LivingEntity +import org.bukkit.inventory.EquipmentSlot + +class EntityArgParserEquipment : EntityArgParser { + override fun parseArguments(args: Array): EntityArgParseResult? { + val equipment = mutableMapOf() + + for (arg in args) { + val argSplit = arg.split(":") + for (slot in EquipmentSlot.values()) { + if (!argSplit[0].equals(slot.name, ignoreCase = true)) { + continue + } + + if (argSplit.size < 2) { + continue + } + + equipment[slot] = Items.lookup(argSplit[1]) + } + } + + if (equipment.isEmpty()) { + return null + } + + return EntityArgParseResult( + { + if (it !is LivingEntity) { + return@EntityArgParseResult false + } + + val entityEquipment = it.equipment ?: return@EntityArgParseResult false + + for ((slot, item) in equipment) { + if (!item.matches(entityEquipment.getItem(slot))) { + return@EntityArgParseResult false + } + } + + return@EntityArgParseResult true + }, + { + if (it !is LivingEntity) { + return@EntityArgParseResult + } + + val entityEquipment = it.equipment ?: return@EntityArgParseResult + + for ((slot, item) in equipment) { + entityEquipment.setItem(slot, item.item, false) + } + } + ) + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt index a1647c05..54e64b5c 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt @@ -24,6 +24,7 @@ import com.willfp.eco.internal.entities.EntityArgParserAttackDamage import com.willfp.eco.internal.entities.EntityArgParserAttackSpeed import com.willfp.eco.internal.entities.EntityArgParserBaby import com.willfp.eco.internal.entities.EntityArgParserCharged +import com.willfp.eco.internal.entities.EntityArgParserEquipment import com.willfp.eco.internal.entities.EntityArgParserExplosionRadius import com.willfp.eco.internal.entities.EntityArgParserFlySpeed import com.willfp.eco.internal.entities.EntityArgParserFollowRange @@ -148,6 +149,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() { Entities.registerArgParser(EntityArgParserCharged()) Entities.registerArgParser(EntityArgParserExplosionRadius()) Entities.registerArgParser(EntityArgParserSilent()) + Entities.registerArgParser(EntityArgParserEquipment()) ShapedRecipeListener.registerListener(ComplexInComplex()) ShapedRecipeListener.registerListener(ComplexInEco())