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:
parent
3b4ca6c0b7
commit
567cf03403
modules
system/src/main/java/chylex/hee/game/block/entity
util/src/main/java/chylex/hee/util/lang
src/main/java/chylex/hee
game/block/entity
TileEntityAccumulationTable.ktTileEntityBrewingStandCustom.ktTileEntityDarkChest.ktTileEntityEndPortalAcceptor.ktTileEntityEnergyCluster.ktTileEntityExperienceGate.ktTileEntityExperienceTable.ktTileEntityIgneousPlate.ktTileEntityInfusedTNT.ktTileEntityInfusionTable.ktTileEntityJarODust.ktTileEntityLootChest.ktTileEntityMinersBurialAltar.ktTileEntityPortalInner.ktTileEntityShulkerBoxCustom.ktTileEntitySpawnerObsidianTower.ktTileEntityTablePedestal.ktTileEntityVoidPortalStorage.kt
base
init
@ -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>
|
||||
}
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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())
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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"
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user