Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable

import gregtech.api.capability.IControllable
import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase
import net.minecraft.util.ResourceLocation

abstract class AdditionalMultiblockBase<T : ExtendableMultiblockBase<T>>(metaTileEntityId: ResourceLocation)
: MultiblockWithDisplayBase(metaTileEntityId), IControllable
{
protected var mainController: ExtendableMultiblockBase<T>? = null

override fun hasMaintenanceMechanics() = false
override fun isWorkingEnabled() = isStructureFormed && isConnected()

protected fun isConnected() = mainController != null && mainController!!.isWorkingEnabled

fun connect(controller: ExtendableMultiblockBase<T>)
{
mainController = controller
}

override fun updateFormedValid()
{
mainController?.addAdditional(this)
}

override fun invalidateStructure()
{
mainController?.removeAdditional(pos)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable

import gregtechlite.gtlitecore.api.collection.openHashMapOf
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.nbt.NBTTagList
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos

open class AdditionalStructureManager<T: ExtendableMultiblockBase<T>>(protected val base: ExtendableMultiblockBase<T>)
{
protected val structures = openHashMapOf<BlockPos, AdditionalMultiblockBase<T>>()

fun add(additionalMultiblockBase: AdditionalMultiblockBase<T>)
{
structures[additionalMultiblockBase.pos] = additionalMultiblockBase
}

fun get(metaTileEntityId: ResourceLocation): MutableList<AdditionalMultiblockBase<T>>
= structures.values.filter { it.metaTileEntityId.equals(metaTileEntityId) }.toMutableList()

fun get(pos: BlockPos): AdditionalMultiblockBase<T>? = structures[pos]

fun remove(pos: BlockPos) = structures.remove(pos)

fun serialize(): NBTTagCompound
{
val nbt = NBTTagCompound()
val list = NBTTagList()
structures.keys.forEach {
val pos = NBTTagCompound().apply {
setInteger("X", it.x)
setInteger("Y", it.y)
setInteger("Z", it.z)
}
list.appendTag(pos)
}
nbt.setTag("BlockPoses", list)
return nbt
}

fun deserialize(nbt: NBTTagCompound): List<BlockPos>
= nbt.getTagList("BlockPoses", 10).filterIsInstance<NBTTagCompound>()
.map { BlockPos(it.getInteger("X"), it.getInteger("Y"), it.getInteger("Z")) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable

import gregtech.api.capability.IControllable
import gregtech.api.capability.IWorkable
import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase
import gregtech.api.util.GTUtility
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos

abstract class ExtendableMultiblockBase<T: ExtendableMultiblockBase<T>>(metaTileEntityId: ResourceLocation)
: MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable
{
protected val additionalStructureManager: AdditionalStructureManager<T> = AdditionalStructureManager(this)

fun removeAdditional(pos: BlockPos)
{
additionalStructureManager.remove(pos)
}

fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase<T>)
{
additionalStructureManager.add(additionalMultiblockBase)
}

override fun writeToNBT(data: NBTTagCompound?): NBTTagCompound?
{
data?.setTag("Additional", additionalStructureManager.serialize())
return super.writeToNBT(data)
}

override fun readFromNBT(data: NBTTagCompound?)
{
super.readFromNBT(data)
data?.getCompoundTag("Additional")?.let {
additionalStructureManager.deserialize(it)
.map { pos -> GTUtility.getMetaTileEntity(world, pos) }
.filterIsInstance<AdditionalMultiblockBase<T>>()
.forEach { additionalMultiblockBase -> additionalMultiblockBase.connect(this) }
}
}
}