1
0
mirror of https://github.com/chylex/Hardcore-Ender-Expansion-2.git synced 2025-04-08 03:15:50 +02:00

Add custom tile entity type interface for automatic property registrations

This commit is contained in:
chylex 2021-07-25 13:58:03 +02:00
parent 3b4ca6c0b7
commit 567cf03403
Signed by: chylex
GPG Key ID: 4DE42C8F19A80548
23 changed files with 194 additions and 101 deletions

View File

@ -0,0 +1,8 @@
package chylex.hee.game.block.entity
import net.minecraft.block.Block
import net.minecraft.tileentity.TileEntity
interface IHeeTileEntityType<T : TileEntity> {
val blocks: Array<out Block>
}

View File

@ -21,9 +21,9 @@ object ObjectConstructors {
}
@Suppress("UNCHECKED_CAST")
inline fun <reified T, reified U> oneArg(): Function<U, T> {
fun <T, U> oneArg(constructedType: Class<T>, parameterType: Class<U>): Function<U, T> {
val mh = MethodHandles.lookup()
val con = mh.unreflectConstructor(T::class.java.getConstructor(U::class.java))
val con = mh.unreflectConstructor(constructedType.getConstructor(parameterType))
val conType = con.type()
val samType = conType.generic()
@ -34,12 +34,17 @@ object ObjectConstructors {
@Suppress("UNCHECKED_CAST")
inline fun <reified ConstructedType : ParentType, reified ParentType, reified FactoryType> generic(constructMethodName: String, vararg constructMethodArgs: Class<*>): MethodHandle {
return generic(ConstructedType::class.java, ParentType::class.java, FactoryType::class.java, constructMethodName, *constructMethodArgs)
}
@Suppress("UNCHECKED_CAST")
fun <ConstructedType : ParentType, ParentType, FactoryType> generic(constructedType: Class<ConstructedType>, parentType: Class<ParentType>, factoryType: Class<FactoryType>, constructMethodName: String, vararg constructMethodArgs: Class<*>): MethodHandle {
val mh = MethodHandles.lookup()
val con = mh.unreflectConstructor(ConstructedType::class.java.getConstructor(*constructMethodArgs))
val con = mh.unreflectConstructor(constructedType.getConstructor(*constructMethodArgs))
val conType = con.type()
val samType = conType.changeReturnType(ParentType::class.java)
val retType = MethodType.methodType(FactoryType::class.java)
val samType = conType.changeReturnType(parentType)
val retType = MethodType.methodType(factoryType)
return LambdaMetafactory.metafactory(mh, constructMethodName, retType, samType, con, conType).target
}

View File

@ -11,6 +11,7 @@ import chylex.hee.game.mechanics.table.process.ProcessManyPedestals.State.Cancel
import chylex.hee.game.mechanics.table.process.ProcessManyPedestals.State.Work
import chylex.hee.game.mechanics.table.process.ProcessOnePedestal
import chylex.hee.game.mechanics.table.process.serializer.BasicProcessSerializer
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.util.color.RGB
import chylex.hee.util.nbt.TagCompound
@ -22,6 +23,15 @@ class TileEntityAccumulationTable(type: TileEntityType<TileEntityAccumulationTab
@Suppress("unused")
constructor() : this(ModTileEntities.ACCUMULATION_TABLE)
object Type : IHeeTileEntityType<TileEntityAccumulationTable> {
override val blocks
get() = arrayOf(
ModBlocks.ACCUMULATION_TABLE_TIER_1,
ModBlocks.ACCUMULATION_TABLE_TIER_2,
ModBlocks.ACCUMULATION_TABLE_TIER_3,
)
}
override val tableIndicatorColor = RGB(220, 89, 55)
override val processTickRate = 3

View File

@ -47,6 +47,11 @@ import java.util.Arrays
import java.util.Random
class TileEntityBrewingStandCustom : BrewingStandTileEntity() {
object Type : IHeeTileEntityType<TileEntityBrewingStandCustom> {
override val blocks
get() = arrayOf(ModBlocks.ENHANCED_BREWING_STAND)
}
companion object {
val SLOTS_POTIONS = 0..2
const val SLOT_REAGENT = 3

View File

@ -1,5 +1,6 @@
package chylex.hee.game.block.entity
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.util.forge.Side
import chylex.hee.util.forge.Sided
@ -10,6 +11,11 @@ import net.minecraft.util.math.AxisAlignedBB
class TileEntityDarkChest(type: TileEntityType<TileEntityDarkChest>) : ChestTileEntity(type) {
constructor() : this(ModTileEntities.DARK_CHEST)
object Type : IHeeTileEntityType<TileEntityDarkChest> {
override val blocks
get() = arrayOf(ModBlocks.DARK_CHEST)
}
@Sided(Side.CLIENT)
override fun getRenderBoundingBox(): AxisAlignedBB {
return AxisAlignedBB(pos.add(-1, 0, -1), pos.add(2, 2, 2))

View File

@ -16,6 +16,7 @@ import chylex.hee.game.world.util.FLAG_SKIP_RENDER
import chylex.hee.game.world.util.FLAG_SYNC_CLIENT
import chylex.hee.game.world.util.breakBlock
import chylex.hee.game.world.util.getTile
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.util.nbt.TagCompound
import chylex.hee.util.nbt.use
@ -24,6 +25,11 @@ import net.minecraft.tileentity.TileEntityType
class TileEntityEndPortalAcceptor(type: TileEntityType<TileEntityEndPortalAcceptor>) : TileEntityBasePortalController(type) {
constructor() : this(ModTileEntities.END_PORTAL_ACCEPTOR)
object Type : IHeeTileEntityType<TileEntityEndPortalAcceptor> {
override val blocks
get() = arrayOf(ModBlocks.END_PORTAL_ACCEPTOR)
}
private companion object {
private const val NO_REFRESH = Int.MAX_VALUE

View File

@ -35,6 +35,7 @@ import chylex.hee.game.world.util.allInCenteredBox
import chylex.hee.game.world.util.breakBlock
import chylex.hee.game.world.util.isAir
import chylex.hee.game.world.util.isAnyPlayerWithinRange
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.system.random.nextFloat
import chylex.hee.system.random.nextInt
@ -50,6 +51,11 @@ import kotlin.math.pow
class TileEntityEnergyCluster(type: TileEntityType<TileEntityEnergyCluster>) : TileEntityBase(type), ITickableTileEntity {
constructor() : this(ModTileEntities.ENERGY_CLUSTER)
object Type : IHeeTileEntityType<TileEntityEnergyCluster> {
override val blocks
get() = arrayOf(ModBlocks.ENERGY_CLUSTER)
}
private companion object {
private const val DEFAULT_NOTIFY_FLAGS = FLAG_SYNC_CLIENT or FLAG_SKIP_RENDER or FLAG_MARK_DIRTY

View File

@ -24,6 +24,7 @@ import chylex.hee.game.particle.spawner.properties.IOffset.Constant
import chylex.hee.game.particle.spawner.properties.IOffset.InBox
import chylex.hee.game.particle.spawner.properties.IShape.Point
import chylex.hee.game.world.util.FLAG_SYNC_CLIENT
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModItems
import chylex.hee.init.ModSounds
import chylex.hee.init.ModTileEntities
@ -60,6 +61,11 @@ import kotlin.math.sin
class TileEntityExperienceGate(type: TileEntityType<TileEntityExperienceGate>) : TileEntityBase(type), ITickableTileEntity {
constructor() : this(ModTileEntities.EXPERIENCE_GATE)
object Type : IHeeTileEntityType<TileEntityExperienceGate> {
override val blocks
get() = arrayOf(ModBlocks.EXPERIENCE_GATE_CONTROLLER)
}
companion object {
private val DAMAGE_START_EXTRACTION = Damage(MAGIC_TYPE, PEACEFUL_KNOCKBACK, IGNORE_INVINCIBILITY())

View File

@ -15,6 +15,7 @@ import chylex.hee.game.mechanics.table.process.ProcessManyPedestals.State.Work
import chylex.hee.game.mechanics.table.process.ProcessOnePedestal
import chylex.hee.game.mechanics.table.process.serializer.MultiProcessSerializer
import chylex.hee.game.mechanics.table.process.serializer.MultiProcessSerializer.Companion.Mapping
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModItems
import chylex.hee.init.ModTileEntities
import chylex.hee.system.random.nextFloat
@ -37,6 +38,15 @@ class TileEntityExperienceTable(type: TileEntityType<TileEntityExperienceTable>)
@Suppress("unused")
constructor() : this(ModTileEntities.EXPERIENCE_TABLE)
object Type : IHeeTileEntityType<TileEntityExperienceTable> {
override val blocks
get() = arrayOf(
ModBlocks.EXPERIENCE_TABLE_TIER_1,
ModBlocks.EXPERIENCE_TABLE_TIER_2,
ModBlocks.EXPERIENCE_TABLE_TIER_3,
)
}
override val tableIndicatorColor = RGB(167, 187, 45)
override val tableDustType = DustType.STARDUST

View File

@ -39,6 +39,11 @@ import kotlin.math.pow
class TileEntityIgneousPlate(type: TileEntityType<TileEntityIgneousPlate>) : TileEntityBaseSpecialFirstTick(type) {
constructor() : this(ModTileEntities.IGNEOUS_PLATE)
object Type : IHeeTileEntityType<TileEntityIgneousPlate> {
override val blocks
get() = arrayOf(ModBlocks.IGNEOUS_PLATE)
}
private companion object {
private const val TICKS_TO_HEAT_UP = 1100
private const val TICKS_TO_COOL_DOWN = 2600

View File

@ -4,6 +4,7 @@ import chylex.hee.game.block.entity.base.TileEntityBase
import chylex.hee.game.block.entity.base.TileEntityBase.Context.STORAGE
import chylex.hee.game.item.infusion.InfusionList
import chylex.hee.game.item.infusion.InfusionTag
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.util.nbt.TagCompound
import net.minecraft.tileentity.TileEntityType
@ -11,6 +12,11 @@ import net.minecraft.tileentity.TileEntityType
class TileEntityInfusedTNT(type: TileEntityType<TileEntityInfusedTNT>) : TileEntityBase(type) {
constructor() : this(ModTileEntities.INFUSED_TNT)
object Type : IHeeTileEntityType<TileEntityInfusedTNT> {
override val blocks
get() = arrayOf(ModBlocks.INFUSED_TNT)
}
var infusions = InfusionList.EMPTY
override fun writeNBT(nbt: TagCompound, context: Context) {

View File

@ -16,6 +16,7 @@ import chylex.hee.game.mechanics.table.process.ProcessManyPedestals.State.Work
import chylex.hee.game.mechanics.table.process.ProcessSupportingItemHolder
import chylex.hee.game.mechanics.table.process.serializer.MultiProcessSerializer
import chylex.hee.game.mechanics.table.process.serializer.MultiProcessSerializer.Companion.Mapping
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.util.color.RGB
import chylex.hee.util.math.over
@ -30,6 +31,15 @@ class TileEntityInfusionTable(type: TileEntityType<TileEntityInfusionTable>) : T
@Suppress("unused")
constructor() : this(ModTileEntities.INFUSION_TABLE)
object Type : IHeeTileEntityType<TileEntityInfusionTable> {
override val blocks
get() = arrayOf(
ModBlocks.INFUSION_TABLE_TIER_1,
ModBlocks.INFUSION_TABLE_TIER_2,
ModBlocks.INFUSION_TABLE_TIER_3,
)
}
override val tableIndicatorColor = RGB(45, 139, 184)
override val tableDustType = DustType.END_POWDER

View File

@ -4,6 +4,7 @@ import chylex.hee.game.block.entity.base.TileEntityBase
import chylex.hee.game.mechanics.dust.DustLayerInventory
import chylex.hee.game.mechanics.dust.DustLayers
import chylex.hee.game.world.util.FLAG_SYNC_CLIENT
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.util.forge.capability.LazyOptional
import chylex.hee.util.nbt.TagCompound
@ -21,6 +22,11 @@ import net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY
class TileEntityJarODust(type: TileEntityType<TileEntityJarODust>) : TileEntityBase(type) {
constructor() : this(ModTileEntities.JAR_O_DUST)
object Type : IHeeTileEntityType<TileEntityJarODust> {
override val blocks
get() = arrayOf(ModBlocks.JAR_O_DUST)
}
companion object {
const val DUST_CAPACITY = 256
const val LAYERS_TAG = "Layers"

View File

@ -8,6 +8,7 @@ import chylex.hee.game.container.ContainerLootChest
import chylex.hee.game.fx.util.playServer
import chylex.hee.game.inventory.util.nonEmptySlots
import chylex.hee.game.inventory.util.setStack
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModSounds
import chylex.hee.init.ModTileEntities
import chylex.hee.util.math.center
@ -37,6 +38,11 @@ import java.util.UUID
class TileEntityLootChest(type: TileEntityType<TileEntityLootChest>) : TileEntityBaseChest(type) {
constructor() : this(ModTileEntities.LOOT_CHEST)
object Type : IHeeTileEntityType<TileEntityLootChest> {
override val blocks
get() = arrayOf(ModBlocks.LOOT_CHEST)
}
companion object {
const val ROWS = 3

View File

@ -65,6 +65,11 @@ import kotlin.math.roundToInt
class TileEntityMinersBurialAltar(type: TileEntityType<TileEntityMinersBurialAltar>) : TileEntityBase(type), ITickableTileEntity {
constructor() : this(ModTileEntities.MINERS_BURIAL_ALTAR)
object Type : IHeeTileEntityType<TileEntityMinersBurialAltar> {
override val blocks
get() = arrayOf(ModBlocks.MINERS_BURIAL_ALTAR)
}
companion object {
private const val HAS_MEDALLION_TAG = "HasMedallion"
private const val REDEEM_TYPE_TAG = "RedeemType"

View File

@ -1,5 +1,6 @@
package chylex.hee.game.block.entity
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModTileEntities
import chylex.hee.util.forge.Side
import chylex.hee.util.forge.Sided
@ -17,9 +18,19 @@ sealed class TileEntityPortalInner(type: TileEntityType<out TileEntityPortalInne
class End(type: TileEntityType<End>) : TileEntityPortalInner(type) {
constructor() : this(ModTileEntities.END_PORTAL_INNER)
object Type : IHeeTileEntityType<TileEntityPortalInner.End> {
override val blocks
get() = arrayOf(ModBlocks.END_PORTAL_INNER)
}
}
class Void(type: TileEntityType<Void>) : TileEntityPortalInner(type) {
constructor() : this(ModTileEntities.VOID_PORTAL_INNER)
object Type : IHeeTileEntityType<TileEntityPortalInner.Void> {
override val blocks
get() = arrayOf(ModBlocks.VOID_PORTAL_INNER)
}
}
}

View File

@ -1,5 +1,6 @@
package chylex.hee.game.block.entity
import chylex.hee.game.block.BlockShulkerBoxOverride
import chylex.hee.game.block.BlockShulkerBoxOverride.BoxSize
import chylex.hee.game.container.ContainerShulkerBox
import chylex.hee.init.ModTileEntities
@ -23,6 +24,11 @@ import net.minecraft.util.text.ITextComponent
import net.minecraft.util.text.TranslationTextComponent
class TileEntityShulkerBoxCustom : ShulkerBoxTileEntity() {
object Type : IHeeTileEntityType<TileEntityShulkerBoxCustom> {
override val blocks
get() = BlockShulkerBoxOverride.ALL_BLOCKS.toTypedArray()
}
companion object {
const val BOX_SIZE_TAG = "BoxSize"
}

View File

@ -21,6 +21,7 @@ import chylex.hee.game.world.util.breakBlock
import chylex.hee.game.world.util.getState
import chylex.hee.game.world.util.isAnyPlayerWithinRange
import chylex.hee.game.world.util.isPeaceful
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModSounds
import chylex.hee.init.ModTileEntities
import chylex.hee.network.client.PacketClientFX
@ -63,6 +64,11 @@ import kotlin.math.max
class TileEntitySpawnerObsidianTower(type: TileEntityType<TileEntitySpawnerObsidianTower>) : TileEntityBaseSpawner(type) {
constructor() : this(ModTileEntities.SPAWNER_OBSIDIAN_TOWER)
object Type : IHeeTileEntityType<TileEntitySpawnerObsidianTower> {
override val blocks
get() = arrayOf(ModBlocks.SPAWNER_OBSIDIAN_TOWERS)
}
companion object {
private val PARTICLE_SMOKE = ParticleSpawnerVanilla(
type = SMOKE,

View File

@ -66,6 +66,11 @@ import java.util.Random
class TileEntityTablePedestal(type: TileEntityType<TileEntityTablePedestal>) : TileEntityBase(type) {
constructor() : this(ModTileEntities.TABLE_PEDESTAL)
object Type : IHeeTileEntityType<TileEntityTablePedestal> {
override val blocks
get() = arrayOf(ModBlocks.TABLE_PEDESTAL)
}
companion object {
private const val TABLE_POS_TAG = "TablePos"
private const val INVENTORY_TAG = "Inventory"

View File

@ -18,6 +18,7 @@ import chylex.hee.game.world.server.SpawnInfo
import chylex.hee.game.world.util.FLAG_SKIP_RENDER
import chylex.hee.game.world.util.FLAG_SYNC_CLIENT
import chylex.hee.game.world.util.isAnyPlayerWithinRange
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModItems
import chylex.hee.init.ModTileEntities
import chylex.hee.util.math.square
@ -40,6 +41,11 @@ import kotlin.math.nextUp
class TileEntityVoidPortalStorage(type: TileEntityType<TileEntityVoidPortalStorage>) : TileEntityBasePortalController(type), IVoidPortalController, INamedContainerProvider {
constructor() : this(ModTileEntities.VOID_PORTAL_STORAGE)
object Type : IHeeTileEntityType<TileEntityVoidPortalStorage> {
override val blocks
get() = arrayOf(ModBlocks.VOID_PORTAL_STORAGE, ModBlocks.VOID_PORTAL_STORAGE_CRAFTED)
}
private companion object {
private const val ACTIVATION_DURATION_TICKS = 20 * 10

View File

@ -29,7 +29,7 @@ import net.minecraft.util.SoundEvent
import net.minecraft.util.SoundEvents
import net.minecraft.util.text.ITextComponent
@Sided(value = Side.CLIENT, _interface = IChestLid::class)
@Sided(Side.CLIENT, _interface = IChestLid::class)
abstract class TileEntityBaseChest(type: TileEntityType<out TileEntityBaseChest>) : TileEntityBase(type), IChestLid, ITickableTileEntity, INamedContainerProvider, INameable {
private companion object {
private const val CUSTOM_NAME_TAG = "CustomName"

View File

@ -32,56 +32,19 @@ import chylex.hee.client.render.entity.RenderEntityMobVampireBat
import chylex.hee.client.render.entity.RenderEntityMobVillagerDying
import chylex.hee.client.render.entity.RenderEntityNothing
import chylex.hee.client.render.entity.RenderEntityProjectileEyeOfEnder
import chylex.hee.client.render.entity.RenderEntitySprite
import chylex.hee.client.render.entity.RenderEntityTerritoryLightningBolt
import chylex.hee.client.render.entity.RenderEntityTokenHolder
import chylex.hee.client.render.item.RenderItemTileEntitySimple
import chylex.hee.game.Resource
import chylex.hee.game.block.IHeeBlock
import chylex.hee.game.block.entity.TileEntityDarkChest
import chylex.hee.game.block.entity.TileEntityExperienceGate
import chylex.hee.game.block.entity.TileEntityIgneousPlate
import chylex.hee.game.block.entity.TileEntityJarODust
import chylex.hee.game.block.entity.TileEntityLootChest
import chylex.hee.game.block.entity.TileEntityMinersBurialAltar
import chylex.hee.game.block.entity.TileEntityPortalInner
import chylex.hee.game.block.entity.TileEntityShulkerBoxCustom
import chylex.hee.game.block.entity.TileEntityTablePedestal
import chylex.hee.game.block.entity.base.TileEntityBaseSpawner
import chylex.hee.game.block.entity.base.TileEntityBaseTable
import chylex.hee.game.block.fluid.FluidEnderGoo
import chylex.hee.game.block.fluid.FluidEnderGooPurified
import chylex.hee.game.block.properties.BlockRenderLayer.CUTOUT
import chylex.hee.game.block.properties.BlockRenderLayer.CUTOUT_MIPPED
import chylex.hee.game.block.properties.BlockRenderLayer.TRANSLUCENT
import chylex.hee.game.block.properties.CustomSkull
import chylex.hee.game.entity.effect.EntityTerritoryLightningBolt
import chylex.hee.game.entity.item.EntityFallingBlockHeavy
import chylex.hee.game.entity.item.EntityFallingObsidian
import chylex.hee.game.entity.item.EntityInfusedTNT
import chylex.hee.game.entity.item.EntityItemCauldronTrigger
import chylex.hee.game.entity.item.EntityItemFreshlyCooked
import chylex.hee.game.entity.item.EntityItemIgneousRock
import chylex.hee.game.entity.item.EntityItemNoBob
import chylex.hee.game.entity.item.EntityItemRevitalizationSubstance
import chylex.hee.game.entity.item.EntityTokenHolder
import chylex.hee.game.entity.living.EntityBossEnderEye
import chylex.hee.game.entity.living.EntityMobAbstractEnderman
import chylex.hee.game.entity.living.EntityMobAngryEnderman
import chylex.hee.game.entity.living.EntityMobBlobby
import chylex.hee.game.entity.living.EntityMobEndermite
import chylex.hee.game.entity.living.EntityMobEndermiteInstability
import chylex.hee.game.entity.living.EntityMobSilverfish
import chylex.hee.game.entity.living.EntityMobSpiderling
import chylex.hee.game.entity.living.EntityMobUndread
import chylex.hee.game.entity.living.EntityMobVampireBat
import chylex.hee.game.entity.living.EntityMobVillagerDying
import chylex.hee.game.entity.projectile.EntityProjectileEnderPearl
import chylex.hee.game.entity.projectile.EntityProjectileExperienceBottle
import chylex.hee.game.entity.projectile.EntityProjectileEyeOfEnder
import chylex.hee.game.entity.projectile.EntityProjectileSpatialDash
import chylex.hee.game.entity.technical.EntityTechnicalBase
import chylex.hee.game.entity.technical.EntityTechnicalIgneousPlateLogic
import chylex.hee.game.item.IHeeItem
import chylex.hee.system.getRegistryEntries
import chylex.hee.util.forge.Side
@ -210,20 +173,20 @@ object ModRendering {
// tile entities
registerTile<TileEntityBaseSpawner, RenderTileSpawner>(ModTileEntities.SPAWNER_OBSIDIAN_TOWER)
registerTile<TileEntityBaseTable, RenderTileTable>(ModTileEntities.ACCUMULATION_TABLE)
registerTile<TileEntityBaseTable, RenderTileTable>(ModTileEntities.EXPERIENCE_TABLE)
registerTile<TileEntityBaseTable, RenderTileTable>(ModTileEntities.INFUSION_TABLE)
registerTile<TileEntityDarkChest, RenderTileDarkChest>(ModTileEntities.DARK_CHEST)
registerTile<TileEntityExperienceGate, RenderTileExperienceGate>(ModTileEntities.EXPERIENCE_GATE)
registerTile<TileEntityIgneousPlate, RenderTileIgneousPlate>(ModTileEntities.IGNEOUS_PLATE)
registerTile<TileEntityJarODust, RenderTileJarODust>(ModTileEntities.JAR_O_DUST)
registerTile<TileEntityLootChest, RenderTileLootChest>(ModTileEntities.LOOT_CHEST)
registerTile<TileEntityMinersBurialAltar, RenderTileMinersBurialAltar>(ModTileEntities.MINERS_BURIAL_ALTAR)
registerTile<TileEntityPortalInner.End, RenderTileEndPortal>(ModTileEntities.END_PORTAL_INNER)
registerTile<TileEntityPortalInner.Void, RenderTileVoidPortal>(ModTileEntities.VOID_PORTAL_INNER)
registerTile<TileEntityShulkerBoxCustom, RenderTileShulkerBox>(ModTileEntities.SHULKER_BOX)
registerTile<TileEntityTablePedestal, RenderTileTablePedestal>(ModTileEntities.TABLE_PEDESTAL)
ModTileEntities.SPAWNER_OBSIDIAN_TOWER.render(RenderTileSpawner::class.java)
ModTileEntities.ACCUMULATION_TABLE.render(RenderTileTable::class.java)
ModTileEntities.EXPERIENCE_TABLE.render(RenderTileTable::class.java)
ModTileEntities.INFUSION_TABLE.render(RenderTileTable::class.java)
ModTileEntities.DARK_CHEST.render(RenderTileDarkChest::class.java)
ModTileEntities.EXPERIENCE_GATE.render(RenderTileExperienceGate::class.java)
ModTileEntities.IGNEOUS_PLATE.render(RenderTileIgneousPlate::class.java)
ModTileEntities.JAR_O_DUST.render(RenderTileJarODust::class.java)
ModTileEntities.LOOT_CHEST.render(RenderTileLootChest::class.java)
ModTileEntities.MINERS_BURIAL_ALTAR.render(RenderTileMinersBurialAltar::class.java)
ModTileEntities.END_PORTAL_INNER.render(RenderTileEndPortal::class.java)
ModTileEntities.VOID_PORTAL_INNER.render(RenderTileVoidPortal::class.java)
ModTileEntities.SHULKER_BOX.render(RenderTileShulkerBox::class.java)
ModTileEntities.TABLE_PEDESTAL.render(RenderTileTablePedestal::class.java)
// miscellaneous
@ -275,8 +238,7 @@ object ModRendering {
RenderingRegistry.registerEntityRenderingHandler(type, handle.invokeExact() as IRenderFactory<T>)
}
@Suppress("UNCHECKED_CAST")
private inline fun <reified T : TileEntity, reified U : TileEntityRenderer<in T>> registerTile(type: TileEntityType<out T>) {
ClientRegistry.bindTileEntityRenderer(type, ObjectConstructors.oneArg<U, TileEntityRendererDispatcher>())
private fun <T : TileEntity> TileEntityType<T>.render(renderer: Class<out TileEntityRenderer<in T>>) {
ClientRegistry.bindTileEntityRenderer(this, ObjectConstructors.oneArg(renderer, TileEntityRendererDispatcher::class.java))
}
}

View File

@ -2,6 +2,7 @@ package chylex.hee.init
import chylex.hee.HEE
import chylex.hee.game.block.BlockShulkerBoxOverride
import chylex.hee.game.block.entity.IHeeTileEntityType
import chylex.hee.game.block.entity.TileEntityAccumulationTable
import chylex.hee.game.block.entity.TileEntityBrewingStandCustom
import chylex.hee.game.block.entity.TileEntityDarkChest
@ -35,25 +36,25 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD
@SubscribeAllEvents(modid = HEE.ID, bus = MOD)
object ModTileEntities {
@JvmField val ACCUMULATION_TABLE = build<TileEntityAccumulationTable>(ModBlocks.ACCUMULATION_TABLE_TIER_1, ModBlocks.ACCUMULATION_TABLE_TIER_2, ModBlocks.ACCUMULATION_TABLE_TIER_3) named "accumulation_table"
@JvmField val BREWING_STAND = build<TileEntityBrewingStandCustom>(ModBlocks.ENHANCED_BREWING_STAND) named "brewing_stand"
@JvmField val DARK_CHEST = build<TileEntityDarkChest>(ModBlocks.DARK_CHEST) named "dark_chest"
@JvmField val END_PORTAL_ACCEPTOR = build<TileEntityEndPortalAcceptor>(ModBlocks.END_PORTAL_ACCEPTOR) named "end_portal_acceptor"
@JvmField val END_PORTAL_INNER = build<TileEntityPortalInner.End>(ModBlocks.END_PORTAL_INNER) named "end_portal_inner"
@JvmField val ENERGY_CLUSTER = build<TileEntityEnergyCluster>(ModBlocks.ENERGY_CLUSTER) named "energy_cluster"
@JvmField val EXPERIENCE_GATE = build<TileEntityExperienceGate>(ModBlocks.EXPERIENCE_GATE_CONTROLLER) named "experience_gate"
@JvmField val EXPERIENCE_TABLE = build<TileEntityExperienceTable>(ModBlocks.EXPERIENCE_TABLE_TIER_1, ModBlocks.EXPERIENCE_TABLE_TIER_2, ModBlocks.EXPERIENCE_TABLE_TIER_3) named "experience_table"
@JvmField val IGNEOUS_PLATE = build<TileEntityIgneousPlate>(ModBlocks.IGNEOUS_PLATE) named "igneous_plate"
@JvmField val INFUSED_TNT = build<TileEntityInfusedTNT>(ModBlocks.INFUSED_TNT) named "infused_tnt"
@JvmField val INFUSION_TABLE = build<TileEntityInfusionTable>(ModBlocks.INFUSION_TABLE_TIER_1, ModBlocks.INFUSION_TABLE_TIER_2, ModBlocks.INFUSION_TABLE_TIER_3) named "infusion_table"
@JvmField val JAR_O_DUST = build<TileEntityJarODust>(ModBlocks.JAR_O_DUST) named "jar_o_dust"
@JvmField val LOOT_CHEST = build<TileEntityLootChest>(ModBlocks.LOOT_CHEST) named "loot_chest"
@JvmField val MINERS_BURIAL_ALTAR = build<TileEntityMinersBurialAltar>(ModBlocks.MINERS_BURIAL_ALTAR) named "miners_burial_altar"
@JvmField val SHULKER_BOX = build<TileEntityShulkerBoxCustom>(*BlockShulkerBoxOverride.ALL_BLOCKS.toTypedArray()) named "shulker_box"
@JvmField val SPAWNER_OBSIDIAN_TOWER = build<TileEntitySpawnerObsidianTower>(ModBlocks.SPAWNER_OBSIDIAN_TOWERS) named "spawner_obsidian_tower"
@JvmField val TABLE_PEDESTAL = build<TileEntityTablePedestal>(ModBlocks.TABLE_PEDESTAL) named "table_pedestal"
@JvmField val VOID_PORTAL_INNER = build<TileEntityPortalInner.Void>(ModBlocks.VOID_PORTAL_INNER) named "void_portal_inner"
@JvmField val VOID_PORTAL_STORAGE = build<TileEntityVoidPortalStorage>(ModBlocks.VOID_PORTAL_STORAGE, ModBlocks.VOID_PORTAL_STORAGE_CRAFTED) named "void_portal_storage"
@JvmField val ACCUMULATION_TABLE = build(TileEntityAccumulationTable.Type) named "accumulation_table"
@JvmField val BREWING_STAND = build(TileEntityBrewingStandCustom.Type) named "brewing_stand"
@JvmField val DARK_CHEST = build(TileEntityDarkChest.Type) named "dark_chest"
@JvmField val END_PORTAL_ACCEPTOR = build(TileEntityEndPortalAcceptor.Type) named "end_portal_acceptor"
@JvmField val END_PORTAL_INNER = build(TileEntityPortalInner.End.Type) named "end_portal_inner"
@JvmField val ENERGY_CLUSTER = build(TileEntityEnergyCluster.Type) named "energy_cluster"
@JvmField val EXPERIENCE_GATE = build(TileEntityExperienceGate.Type) named "experience_gate"
@JvmField val EXPERIENCE_TABLE = build(TileEntityExperienceTable.Type) named "experience_table"
@JvmField val IGNEOUS_PLATE = build(TileEntityIgneousPlate.Type) named "igneous_plate"
@JvmField val INFUSED_TNT = build(TileEntityInfusedTNT.Type) named "infused_tnt"
@JvmField val INFUSION_TABLE = build(TileEntityInfusionTable.Type) named "infusion_table"
@JvmField val JAR_O_DUST = build(TileEntityJarODust.Type) named "jar_o_dust"
@JvmField val LOOT_CHEST = build(TileEntityLootChest.Type) named "loot_chest"
@JvmField val MINERS_BURIAL_ALTAR = build(TileEntityMinersBurialAltar.Type) named "miners_burial_altar"
@JvmField val SHULKER_BOX = build(TileEntityShulkerBoxCustom.Type) named "shulker_box"
@JvmField val SPAWNER_OBSIDIAN_TOWER = build(TileEntitySpawnerObsidianTower.Type) named "spawner_obsidian_tower"
@JvmField val TABLE_PEDESTAL = build(TileEntityTablePedestal.Type) named "table_pedestal"
@JvmField val VOID_PORTAL_INNER = build(TileEntityPortalInner.Void.Type) named "void_portal_inner"
@JvmField val VOID_PORTAL_STORAGE = build(TileEntityVoidPortalStorage.Type) named "void_portal_storage"
@SubscribeEvent
fun onRegister(e: RegistryEvent.Register<TileEntityType<*>>) {
@ -61,35 +62,31 @@ object ModTileEntities {
}
fun setupVanillaValidBlocks() {
for (block in arrayOf(BREWING_STAND, TileEntityType.BREWING_STAND)) {
with(block) {
validBlocks = ImmutableSet.builder<Block>()
.addAll(validBlocks)
.add(Blocks.BREWING_STAND) // needs the replaced one
.build()
}
arrayOf(BREWING_STAND, TileEntityType.BREWING_STAND).extendValidBlocks {
add(Blocks.BREWING_STAND)
}
for (block in arrayOf(SHULKER_BOX, TileEntityType.SHULKER_BOX)) {
with(block) {
validBlocks = ImmutableSet.builder<Block>()
.addAll(validBlocks)
.addAll(BlockShulkerBoxOverride.ALL_BLOCKS) // needs the replaced ones
.build()
}
arrayOf(SHULKER_BOX, TileEntityType.SHULKER_BOX).extendValidBlocks {
addAll(BlockShulkerBoxOverride.ALL_BLOCKS)
}
with(TileEntityType.SKULL) {
validBlocks = ImmutableSet.builder<Block>()
.addAll(validBlocks)
.add(ModBlocks.ENDERMAN_HEAD)
.add(ModBlocks.ENDERMAN_WALL_HEAD)
.build()
TileEntityType.SKULL.extendValidBlocks {
add(ModBlocks.ENDERMAN_HEAD, ModBlocks.ENDERMAN_WALL_HEAD)
}
}
private inline fun <reified T : TileEntity> build(vararg blocks: Block): TileEntityType<T> {
private inline fun <reified T : TileEntity> build(type: IHeeTileEntityType<T>): TileEntityType<T> {
@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
return TileEntityType.Builder.create(ObjectConstructors.noArgs<T>(), *blocks).build(null)
return TileEntityType.Builder.create(ObjectConstructors.noArgs<T>(), *type.blocks).build(null)
}
private inline fun <T : TileEntity> Array<TileEntityType<out T>>.extendValidBlocks(setCallback: ImmutableSet.Builder<Block>.() -> ImmutableSet.Builder<Block>) {
for (tileEntityType in this) {
tileEntityType.extendValidBlocks(setCallback)
}
}
private inline fun <T : TileEntity> TileEntityType<T>.extendValidBlocks(setCallback: ImmutableSet.Builder<Block>.() -> ImmutableSet.Builder<Block>) {
this.validBlocks = ImmutableSet.builder<Block>().addAll(this.validBlocks).let(setCallback).build()
}
}