From 1df4ed809fcfd6f664d36bb47b624a87e4e5bb0d Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 28 Aug 2022 20:28:30 +0700 Subject: [PATCH] Make research internally use identity hash map --- .../otm/capability/MatteryPlayerCapability.kt | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index f8903103f..579411c94 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -52,7 +52,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn private var willBecomeAndroidNetwork = false private var shouldPlaySound = false - private val research = ArrayList() + private val research = IdentityHashMap, AndroidResearch>() private var remoteBattery = ImpreciseFraction(-1) private var remoteMaxBattery = ImpreciseFraction(-1) @@ -117,7 +117,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn fun obliviate(refund: Boolean = true) { if (refund) { - for (instance in research) { + for (instance in research.values) { if (instance.isResearched) { instance.unResearch() instance.refund(simulate = false) @@ -133,15 +133,9 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn } fun getResearch(type: AndroidResearchType): T { - for (instance in research) { - if (instance.type === type) { - return instance as T - } - } - - val instance = type.factory(this) - research.add(instance) - return instance + return research.computeIfAbsent(type) { + return@computeIfAbsent type.factory(this) + } as T } private fun addFeature(feature: AndroidFeature): Boolean { @@ -257,10 +251,10 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn val list = ListTag() - for (instance in research) { + for ((type, instance) in research) { val researchTag = instance.serializeNBT() - researchTag["id"] = instance.type.registryName!!.toString() + researchTag["id"] = type.registryName!!.toString() list.add(researchTag) } @@ -316,7 +310,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn if (research != null) { val instance = research.factory(this) instance.deserializeNBT(tag) - this.research.add(instance) + this.research[research] = instance } } } @@ -448,7 +442,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn remoteIsAndroid = false willBecomeAndroidNetwork = false - for (instance in research) { + for (instance in research.values) { instance.isDirty = true instance.invalidateNetwork() } @@ -495,7 +489,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn sendNetwork(WillBecomeAndroidPacket(willBecomeAndroid)) } - for (instance in research) { + for (instance in research.values) { if (instance.isDirty) { instance.isDirty = false sendNetwork(AndroidResearchSyncPacket(instance))