Some fixes for holo signs save/load, fix for redstone control
This commit is contained in:
parent
a9b28a66ca
commit
689d9cd5c1
@ -136,7 +136,7 @@ fun addLootTables(lootTables: LootTables) {
|
||||
lootTables.tile(MBlocks.ENERGY_SERVO)
|
||||
lootTables.tile(MBlocks.ENERGY_COUNTER)
|
||||
lootTables.tile(MBlocks.CHEMICAL_GENERATOR)
|
||||
lootTables.tile(MBlocks.HOLO_SIGN)
|
||||
lootTables.tile(MBlocks.HOLO_SIGN, "isLocked")
|
||||
lootTables.tile(MBlocks.STORAGE_CABLE)
|
||||
lootTables.tile(MBlocks.ANDROID_STATION)
|
||||
lootTables.tile(MBlocks.BATTERY_BANK)
|
||||
|
@ -11,6 +11,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.network.chat.Component
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraftforge.common.capabilities.ForgeCapabilities
|
||||
import net.minecraftforge.items.IItemHandler
|
||||
import ru.dbotthepony.mc.otm.capability.CombinedItemHandler
|
||||
@ -30,6 +31,7 @@ import ru.dbotthepony.mc.otm.core.nbt.getJson
|
||||
import ru.dbotthepony.mc.otm.core.nbt.putJson
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.core.util.ITickable
|
||||
import ru.dbotthepony.mc.otm.once
|
||||
|
||||
/**
|
||||
* Device block entity base, implementing [MenuProvider] and [IRedstoneControlled], and also tracks custom display name
|
||||
@ -38,13 +40,17 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
: MatteryBlockEntity(blockEntityType, blockPos, blockState), MenuProvider, IRedstoneControlled {
|
||||
var customDisplayName: Component? = null
|
||||
|
||||
override val redstoneControl: AbstractRedstoneControl = RedstoneControl { new, old ->
|
||||
override val redstoneControl = RedstoneControl { new, old ->
|
||||
setChangedLight()
|
||||
|
||||
if (new != old)
|
||||
redstoneStatusUpdated(new, old)
|
||||
}
|
||||
|
||||
init {
|
||||
savetables.stateful(::redstoneControl, REDSTONE_CONTROL_KEY)
|
||||
}
|
||||
|
||||
protected open val defaultDisplayName: Component
|
||||
get() = level?.getBlockState(blockPos)?.block?.name ?: TextComponent("null at $blockPos")
|
||||
|
||||
@ -58,18 +64,23 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
|
||||
|
||||
override fun saveAdditional(nbt: CompoundTag) {
|
||||
super.saveAdditional(nbt)
|
||||
|
||||
if (customDisplayName != null)
|
||||
nbt.putJson("Name", Component.Serializer.toJsonTree(customDisplayName!!))
|
||||
|
||||
nbt[REDSTONE_CONTROL_KEY] = redstoneControl.serializeNBT()
|
||||
}
|
||||
|
||||
override fun load(nbt: CompoundTag) {
|
||||
super.load(nbt)
|
||||
|
||||
customDisplayName = nbt.getJson("Name")?.let(Component.Serializer::fromJson)
|
||||
redstoneControl.deserializeNBT(nbt[REDSTONE_CONTROL_KEY] as? CompoundTag)
|
||||
}
|
||||
|
||||
override fun setLevel(level: Level) {
|
||||
super.setLevel(level)
|
||||
|
||||
level.once {
|
||||
if (!isRemoved && this.level == level) {
|
||||
redstoneControl.redstoneSignal = level.getBestNeighborSignal(blockPos)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inner class ConfigurableEnergy<T : IMatteryEnergyStorage>(
|
||||
|
@ -10,7 +10,7 @@ interface IRedstoneControlled {
|
||||
val redstoneControl: AbstractRedstoneControl
|
||||
}
|
||||
|
||||
abstract class AbstractRedstoneControl : INBTSerializable<CompoundTag> {
|
||||
abstract class AbstractRedstoneControl : INBTSerializable<CompoundTag?> {
|
||||
abstract var redstoneSetting: RedstoneSetting
|
||||
abstract var redstoneSignal: Int
|
||||
|
||||
|
@ -7,24 +7,31 @@ import net.minecraft.world.MenuProvider
|
||||
import net.minecraft.world.entity.player.Inventory
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.inventory.AbstractContainerMenu
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import ru.dbotthepony.mc.otm.block.entity.IRedstoneControlled
|
||||
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
|
||||
import ru.dbotthepony.mc.otm.block.entity.SynchronizedRedstoneControl
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.menu.decorative.HoloSignMenu
|
||||
import ru.dbotthepony.mc.otm.once
|
||||
import ru.dbotthepony.mc.otm.registry.MBlockEntities
|
||||
import ru.dbotthepony.mc.otm.registry.MBlocks
|
||||
|
||||
class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryBlockEntity(MBlockEntities.HOLO_SIGN, blockPos, blockState), MenuProvider, IRedstoneControlled {
|
||||
override val redstoneControl = SynchronizedRedstoneControl(synchronizer) { _, _ -> setChanged() }
|
||||
|
||||
var text by synchronizer.string("", name = "text", setter = { value, access, remote ->
|
||||
var signText by synchronizer.string("", name = "text", setter = { value, access, remote ->
|
||||
setChanged()
|
||||
access.write(value)
|
||||
})
|
||||
|
||||
var locked = false
|
||||
var isLocked = false
|
||||
|
||||
init {
|
||||
savetables.string(::signText)
|
||||
savetables.bool(::isLocked)
|
||||
savetables.stateful(::redstoneControl)
|
||||
}
|
||||
|
||||
override fun createMenu(p_39954_: Int, p_39955_: Inventory, p_39956_: Player): AbstractContainerMenu {
|
||||
return HoloSignMenu(p_39954_, p_39955_, this)
|
||||
@ -34,29 +41,24 @@ class HoloSignBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryB
|
||||
return MBlocks.HOLO_SIGN.name
|
||||
}
|
||||
|
||||
override fun saveAdditional(nbt: CompoundTag) {
|
||||
super.saveAdditional(nbt)
|
||||
nbt[TEXT_KEY] = text
|
||||
nbt[REDSTONE_CONTROL_KEY] = redstoneControl.serializeNBT()
|
||||
override fun setLevel(level: Level) {
|
||||
super.setLevel(level)
|
||||
|
||||
level.once {
|
||||
if (!isRemoved && this.level == level) {
|
||||
redstoneControl.redstoneSignal = level.getBestNeighborSignal(blockPos)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun load(nbt: CompoundTag) {
|
||||
super.load(nbt)
|
||||
locked = nbt.getBoolean(LOCKED_KEY)
|
||||
|
||||
if (locked) {
|
||||
text = nbt.getString(TEXT_KEY)
|
||||
} else {
|
||||
text = truncate(nbt.getString(TEXT_KEY))
|
||||
}
|
||||
|
||||
redstoneControl.deserializeNBT(nbt[REDSTONE_CONTROL_KEY] as? CompoundTag)
|
||||
if (!isLocked)
|
||||
signText = truncate(signText)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TEXT_KEY = "SignText"
|
||||
const val LOCKED_KEY = "Locked"
|
||||
const val REDSTONE_CONTROL_KEY = "RedstoneControl"
|
||||
const val DEFAULT_MAX_NEWLINES = 8
|
||||
const val DEFAULT_MAX_LINE_LENGTH = 15
|
||||
private val NEWLINES = Regex("\r?\n")
|
||||
|
@ -4,16 +4,12 @@ import com.mojang.blaze3d.vertex.PoseStack
|
||||
import net.minecraft.client.renderer.MultiBufferSource
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer
|
||||
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider
|
||||
import net.minecraft.core.Direction
|
||||
import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock
|
||||
import ru.dbotthepony.mc.otm.block.entity.decorative.HoloSignBlockEntity
|
||||
import ru.dbotthepony.mc.otm.client.font
|
||||
import ru.dbotthepony.mc.otm.client.render.DynamicBufferSource
|
||||
import ru.dbotthepony.mc.otm.client.render.TextAlign
|
||||
import ru.dbotthepony.mc.otm.client.render.drawAligned
|
||||
import ru.dbotthepony.mc.otm.core.get
|
||||
import ru.dbotthepony.mc.otm.core.math.RGBAColor
|
||||
import ru.dbotthepony.mc.otm.core.math.facingTwo
|
||||
import ru.dbotthepony.mc.otm.core.math.rotateWithBlockFacing
|
||||
import ru.dbotthepony.mc.otm.core.math.rotationThree
|
||||
|
||||
@ -36,7 +32,7 @@ class HoloSignRenderer(private val context: BlockEntityRendererProvider.Context)
|
||||
|
||||
val sorse = DynamicBufferSource.WORLD
|
||||
|
||||
val lines = tile.text.split('\n')
|
||||
val lines = tile.signText.split('\n')
|
||||
val totalHeight = lines.size * font.lineHeight + (lines.size - 1) * 2f
|
||||
var y = -totalHeight / 2f
|
||||
|
||||
|
@ -135,6 +135,18 @@ class Savetables : INBTSerializable<CompoundTag> {
|
||||
.withDeserializer { it.asByte > 0 }
|
||||
}
|
||||
|
||||
fun string(prop: GetterSetter<String>, name: String): Stateless<String, StringTag> {
|
||||
return Stateless(prop, name, StringTag::class.java)
|
||||
.withSerializer { StringTag.valueOf(it) }
|
||||
.withDeserializer { it.asString }
|
||||
}
|
||||
|
||||
fun string(prop: KMutableProperty0<String>, name: String = prop.name): Stateless<String, StringTag> {
|
||||
return Stateless(prop, name, StringTag::class.java)
|
||||
.withSerializer { StringTag.valueOf(it) }
|
||||
.withDeserializer { it.asString }
|
||||
}
|
||||
|
||||
fun <E : Enum<E>> enum(prop: GetterSetter<E>, name: String, map: (String) -> E): Stateless<E, StringTag> {
|
||||
return Stateless(prop, name, StringTag::class.java)
|
||||
.withSerializer { StringTag.valueOf(it.name) }
|
||||
|
@ -25,8 +25,8 @@ class HoloSignMenu @JvmOverloads constructor(
|
||||
locked.filter { it.isCreative }
|
||||
|
||||
if (tile != null) {
|
||||
text.withConsumer { if (tile.locked) tile.text = it else tile.text = HoloSignBlockEntity.truncate(it) }.withSupplier(tile::text)
|
||||
locked.with(tile::locked)
|
||||
text.withConsumer { if (tile.isLocked) tile.signText = it else tile.signText = HoloSignBlockEntity.truncate(it) }.withSupplier(tile::signText)
|
||||
locked.with(tile::isLocked)
|
||||
redstone.with(tile.redstoneControl::redstoneSetting)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user