Make research internally use identity hash map

This commit is contained in:
DBotThePony 2022-08-28 20:28:30 +07:00
parent 2042b8a9ab
commit 1df4ed809f
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -52,7 +52,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn
private var willBecomeAndroidNetwork = false
private var shouldPlaySound = false
private val research = ArrayList<AndroidResearch>()
private val research = IdentityHashMap<AndroidResearchType<*>, 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 <T : AndroidResearch> getResearch(type: AndroidResearchType<T>): 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))