From 760cdef6adae6a4588c45d1def6a89b5c042afeb Mon Sep 17 00:00:00 2001 From: alexcrea Date: Sat, 3 Feb 2024 03:33:25 +0100 Subject: [PATCH] Add optimisations. --- .../alexcrea/group/AbstractMaterialGroup.kt | 36 +++++++++++++++++++ .../alexcrea/group/EnchantConflictGroup.kt | 2 +- .../alexcrea/group/EnchantConflictManager.kt | 4 +-- .../kotlin/xyz/alexcrea/group/ExcludeGroup.kt | 30 +++++++++++++--- .../kotlin/xyz/alexcrea/group/IncludeGroup.kt | 29 +++++---------- .../xyz/alexcrea/group/ItemGroupManager.kt | 10 +++--- .../xyz/alexcrea/group/MaterialGroup.kt | 22 ------------ 7 files changed, 78 insertions(+), 55 deletions(-) create mode 100644 src/main/kotlin/xyz/alexcrea/group/AbstractMaterialGroup.kt delete mode 100644 src/main/kotlin/xyz/alexcrea/group/MaterialGroup.kt diff --git a/src/main/kotlin/xyz/alexcrea/group/AbstractMaterialGroup.kt b/src/main/kotlin/xyz/alexcrea/group/AbstractMaterialGroup.kt new file mode 100644 index 0000000..07921b0 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/group/AbstractMaterialGroup.kt @@ -0,0 +1,36 @@ +package xyz.alexcrea.group + +import org.bukkit.Material +import java.util.EnumSet + +abstract class AbstractMaterialGroup(private val name: String) { + protected val includedMaterial by lazy {createDefaultSet()} + + // Get the group as a set + protected abstract fun createDefaultSet(): EnumSet + + // Get if a material is allowed following the group policy + fun contain(mat : Material): Boolean { + return mat in includedMaterial + } + + // Get if a group is referenced by this + abstract fun isReferencing(other : AbstractMaterialGroup): Boolean + + // Push a material to this group to follow this group policy + abstract fun addToPolicy(mat : Material) + + // Push a group to this group to follow this group policy + abstract fun addToPolicy(other : AbstractMaterialGroup) + + // Get the group name in case something is wrong + fun getName(): String { + return name + } + + // Get the group as a set + fun getSet(): Set { + return includedMaterial + } + +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/group/EnchantConflictGroup.kt index a05d028..d0f425f 100644 --- a/src/main/kotlin/xyz/alexcrea/group/EnchantConflictGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/group/EnchantConflictGroup.kt @@ -4,7 +4,7 @@ import io.delilaheve.util.ItemUtil.findEnchantments import org.bukkit.enchantments.Enchantment import org.bukkit.inventory.ItemStack -class EnchantConflictGroup(val cantConflict: MaterialGroup, val minBeforeBlock: Int){ +class EnchantConflictGroup(val cantConflict: AbstractMaterialGroup, val minBeforeBlock: Int){ private val enchantments = HashSet() diff --git a/src/main/kotlin/xyz/alexcrea/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/group/EnchantConflictManager.kt index fea9239..42afb83 100644 --- a/src/main/kotlin/xyz/alexcrea/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/group/EnchantConflictManager.kt @@ -86,7 +86,7 @@ class EnchantConflictManager { } // Find or create the selected group for the conflict val groupList = section.getStringList(CONFLICT_GROUP_PATH) - val finalGroup: MaterialGroup + val finalGroup: AbstractMaterialGroup if(groupList.size < 1){ finalGroup = DEFAULT_EMPTY_GROUP }else if(groupList.size == 1){ @@ -101,7 +101,7 @@ class EnchantConflictManager { return EnchantConflictGroup(finalGroup, minBeforeBlock) } - private fun findGroup(groupName: String,itemManager: ItemGroupManager, conflictName: String): MaterialGroup { + private fun findGroup(groupName: String,itemManager: ItemGroupManager, conflictName: String): AbstractMaterialGroup { val group = itemManager.get(groupName) if(group == null){ UnsafeEnchants.instance.logger.warning("Group $groupName do not exist but is ask by conflict $conflictName") diff --git a/src/main/kotlin/xyz/alexcrea/group/ExcludeGroup.kt b/src/main/kotlin/xyz/alexcrea/group/ExcludeGroup.kt index 26c2f45..e929346 100644 --- a/src/main/kotlin/xyz/alexcrea/group/ExcludeGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/group/ExcludeGroup.kt @@ -1,11 +1,33 @@ package xyz.alexcrea.group import org.bukkit.Material +import java.util.* +import kotlin.collections.HashSet -class ExcludeGroup(name: String): IncludeGroup(name) { - - override fun contain(mat: Material): Boolean { - return !super.contain(mat) +class ExcludeGroup(name: String): AbstractMaterialGroup(name) { + override fun createDefaultSet(): EnumSet { + return EnumSet.allOf(Material::class.java) } + private val includedGroup = HashSet() + + override fun isReferencing(other: AbstractMaterialGroup): Boolean { + for (materialGroup in includedGroup.iterator()) { + if((materialGroup == other) || (materialGroup.isReferencing(other))){ + return true + } + } + return false + } + + override fun addToPolicy(mat: Material) { + includedMaterial.remove(mat) + } + + override fun addToPolicy(other: AbstractMaterialGroup) { + includedGroup.add(other) + includedMaterial.removeAll(other.getSet()) + } + + } \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/group/IncludeGroup.kt b/src/main/kotlin/xyz/alexcrea/group/IncludeGroup.kt index f524612..d349821 100644 --- a/src/main/kotlin/xyz/alexcrea/group/IncludeGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/group/IncludeGroup.kt @@ -3,24 +3,14 @@ package xyz.alexcrea.group import org.bukkit.Material import java.util.EnumSet -open class IncludeGroup(private val name: String): MaterialGroup{ - private val includedMaterial = EnumSet.noneOf(Material::class.java) - private val includedGroup = HashSet() - - override fun contain(mat: Material): Boolean { - if(mat in includedMaterial){ - return true - } - - for (materialGroup in includedGroup.iterator()) { - if(materialGroup.contain(mat)){ - return true - } - } - return false +class IncludeGroup(name: String): AbstractMaterialGroup(name) { + override fun createDefaultSet(): EnumSet { + return EnumSet.noneOf(Material::class.java) } - override fun isReferencing(other: MaterialGroup): Boolean { + private val includedGroup = HashSet() + + override fun isReferencing(other: AbstractMaterialGroup): Boolean { for (materialGroup in includedGroup.iterator()) { if((materialGroup == other) || (materialGroup.isReferencing(other))){ return true @@ -33,12 +23,9 @@ open class IncludeGroup(private val name: String): MaterialGroup{ includedMaterial.add(mat) } - override fun addToPolicy(other: MaterialGroup) { + override fun addToPolicy(other: AbstractMaterialGroup) { includedGroup.add(other) - } - - override fun getName(): String { - return name + includedMaterial.addAll(other.getSet()) } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/group/ItemGroupManager.kt b/src/main/kotlin/xyz/alexcrea/group/ItemGroupManager.kt index 9173582..7c02d47 100644 --- a/src/main/kotlin/xyz/alexcrea/group/ItemGroupManager.kt +++ b/src/main/kotlin/xyz/alexcrea/group/ItemGroupManager.kt @@ -20,7 +20,7 @@ class ItemGroupManager { private val FUTURE_MATERIAL = setOf("PIGLIN_HEAD","BRUSH") } - private lateinit var groupMap : HashMap + private lateinit var groupMap : HashMap // Read and create material groups fun prepareGroups(config: YamlConfiguration){ @@ -37,12 +37,12 @@ class ItemGroupManager { // Create group by key private fun createGroup(config: YamlConfiguration, keys: Set, - key: String): MaterialGroup{ + key: String): AbstractMaterialGroup{ val groupSection = config.getConfigurationSection(key)!! val groupType = groupSection.getString(GROUP_TYPE_PATH,null) // Create Material group according to the group type - val group: MaterialGroup + val group: AbstractMaterialGroup if(GroupType.EXCLUDE.equal(groupType)){ group = ExcludeGroup(key) }else { @@ -58,7 +58,7 @@ class ItemGroupManager { } // Read Group elements - private fun readGroup(group: MaterialGroup, + private fun readGroup(group: AbstractMaterialGroup, groupSection: ConfigurationSection, config: YamlConfiguration, keys: Set){ @@ -109,7 +109,7 @@ class ItemGroupManager { } // Get the selected group or return null if it doesn't exist - fun get(groupName: String): MaterialGroup? { + fun get(groupName: String): AbstractMaterialGroup? { return groupMap[groupName] } diff --git a/src/main/kotlin/xyz/alexcrea/group/MaterialGroup.kt b/src/main/kotlin/xyz/alexcrea/group/MaterialGroup.kt deleted file mode 100644 index 180544b..0000000 --- a/src/main/kotlin/xyz/alexcrea/group/MaterialGroup.kt +++ /dev/null @@ -1,22 +0,0 @@ -package xyz.alexcrea.group - -import org.bukkit.Material - -interface MaterialGroup { - - // Get if a material is allowed following the group policy - fun contain(mat : Material): Boolean - - // Get if a group is referenced by this - fun isReferencing(other : MaterialGroup): Boolean - - // Push a material to this group to follow this group policy - fun addToPolicy(mat : Material) - - // Push a group to this group to follow this group policy - fun addToPolicy(other : MaterialGroup) - - // Get the group name in case something is wrong - fun getName(): String - -} \ No newline at end of file