Compare commits

...

2 Commits

Author SHA1 Message Date
b116ae7f91
Flywheel material tooltips 2025-02-10 15:46:03 +07:00
e55b1da9cb
Proper flywheel data values 2025-02-10 15:03:52 +07:00
7 changed files with 149 additions and 7 deletions

View File

@ -6,9 +6,9 @@ import ru.dbotthepony.mc.otm.data.FlywheelMaterialDataProvider
import ru.dbotthepony.mc.otm.registry.MBlockTags import ru.dbotthepony.mc.otm.registry.MBlockTags
fun addFlywheelMaterials(provider: FlywheelMaterialDataProvider) { fun addFlywheelMaterials(provider: FlywheelMaterialDataProvider) {
provider.add(Tags.Blocks.STORAGE_BLOCKS_DIAMOND, Decimal(1_000_000)) provider.add(Tags.Blocks.STORAGE_BLOCKS_DIAMOND, Decimal(25_000_000))
provider.add(Tags.Blocks.STORAGE_BLOCKS_COPPER, Decimal(3_500_000)) provider.add(Tags.Blocks.STORAGE_BLOCKS_COPPER, Decimal(60_000_000))
provider.add(Tags.Blocks.STORAGE_BLOCKS_IRON, Decimal(3_000_000)) provider.add(Tags.Blocks.STORAGE_BLOCKS_IRON, Decimal(50_000_000))
provider.add(Tags.Blocks.STORAGE_BLOCKS_GOLD, Decimal(18_000_000)) provider.add(Tags.Blocks.STORAGE_BLOCKS_GOLD, Decimal(300_000_000))
provider.add(MBlockTags.TRITANIUM_BLOCKS, Decimal(9_000_000)) provider.add(MBlockTags.TRITANIUM_BLOCKS, Decimal(225_000_000))
} }

View File

@ -409,6 +409,11 @@ private fun misc(provider: MatteryLanguageProvider) {
gui("matter.format_and_complexity2", "%s (%s) / Complexity: %s (%s)") gui("matter.format_and_complexity2", "%s (%s) / Complexity: %s (%s)")
gui("matter.name", "MtU") gui("matter.name", "MtU")
gui("flywheel.top", "When used as flywheel core:")
gui("flywheel.storage", "* Storage: %s")
gui("flywheel.receive_efficiency", "* Wind up efficiency: %s")
gui("flywheel.momentum_loss_speed", "* Momentum loss speed factor: %s")
gui("filter.is_whitelist", "Is Whitelist") gui("filter.is_whitelist", "Is Whitelist")
gui("filter.match_nbt", "Match NBT") gui("filter.match_nbt", "Match NBT")
gui("filter.match_tag", "Match Tag") gui("filter.match_tag", "Match Tag")

View File

@ -406,6 +406,11 @@ private fun misc(provider: MatteryLanguageProvider) {
gui("matter.format_and_complexity2", "%s (%s) / Сложность: %s (%s)") gui("matter.format_and_complexity2", "%s (%s) / Сложность: %s (%s)")
gui("matter.name", "МтЕд") gui("matter.name", "МтЕд")
gui("flywheel.top", "Как материал сердечника маховой батареи:")
gui("flywheel.storage", "* Хранилище: %s")
gui("flywheel.receive_efficiency", "* КПД раскрутки: %s")
gui("flywheel.momentum_loss_speed", "* Фактор потери накопленной скорости: %s")
gui("filter.is_whitelist", "Белый список") gui("filter.is_whitelist", "Белый список")
gui("filter.match_nbt", "Сравнивать NBT") gui("filter.match_nbt", "Сравнивать NBT")
gui("filter.match_tag", "Сравнить Теги") gui("filter.match_tag", "Сравнить Теги")

View File

@ -206,6 +206,7 @@ object OverdriveThatMatters {
FORGE_BUS.addListener(EventPriority.NORMAL, AndroidResearchManager::syncEvent) FORGE_BUS.addListener(EventPriority.NORMAL, AndroidResearchManager::syncEvent)
FORGE_BUS.addListener(EventPriority.NORMAL, FlywheelMaterials::reloadEvent) FORGE_BUS.addListener(EventPriority.NORMAL, FlywheelMaterials::reloadEvent)
FORGE_BUS.addListener(EventPriority.NORMAL, FlywheelMaterials::onDataPackSync)
FORGE_BUS.addListener(EventPriority.NORMAL, MatterManager::reloadEvent) FORGE_BUS.addListener(EventPriority.NORMAL, MatterManager::reloadEvent)
FORGE_BUS.addListener(EventPriority.NORMAL, MatterManager::onServerStarted) FORGE_BUS.addListener(EventPriority.NORMAL, MatterManager::onServerStarted)
@ -243,6 +244,7 @@ object OverdriveThatMatters {
private fun setupClient(event: FMLClientSetupEvent) { private fun setupClient(event: FMLClientSetupEvent) {
FORGE_BUS.addListener(EventPriority.NORMAL, MatterManager::tooltipEvent) FORGE_BUS.addListener(EventPriority.NORMAL, MatterManager::tooltipEvent)
FORGE_BUS.addListener(EventPriority.NORMAL, FlywheelMaterials::tooltipEvent)
FORGE_BUS.addListener(EventPriority.NORMAL, MatteryGUI::onScreenRender) FORGE_BUS.addListener(EventPriority.NORMAL, MatteryGUI::onScreenRender)
FORGE_BUS.addListener(EventPriority.LOWEST, MatteryGUI::onOpenGUIEvent) FORGE_BUS.addListener(EventPriority.LOWEST, MatteryGUI::onOpenGUIEvent)

View File

@ -15,6 +15,7 @@ import net.minecraft.Util
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
import net.minecraft.core.Holder import net.minecraft.core.Holder
import net.minecraft.core.HolderLookup import net.minecraft.core.HolderLookup
import net.minecraft.core.IdMap
import net.minecraft.core.Registry import net.minecraft.core.Registry
import net.minecraft.core.SectionPos import net.minecraft.core.SectionPos
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
@ -264,8 +265,16 @@ inline fun itemAttributes(builder: ItemAttributeModifiers.Builder.() -> Unit): I
return value.build() return value.build()
} }
fun <T : Any> FriendlyByteBuf.writeType(registry: IdMap<T>, value: T) {
writeInt(registry.getId(value))
}
fun FriendlyByteBuf.writeBlockType(value: Block) {
writeType(BuiltInRegistries.BLOCK, value)
}
fun FriendlyByteBuf.writeItemType(value: Item) { fun FriendlyByteBuf.writeItemType(value: Item) {
writeInt(BuiltInRegistries.ITEM.getId(value)) writeType(BuiltInRegistries.ITEM, value)
} }
fun RegistryFriendlyByteBuf.writeItem(value: ItemStack) { fun RegistryFriendlyByteBuf.writeItem(value: ItemStack) {
@ -280,8 +289,17 @@ fun OutputStream.writeItemType(value: Item) {
writeVarIntLE(BuiltInRegistries.ITEM.getId(value)) writeVarIntLE(BuiltInRegistries.ITEM.getId(value))
} }
fun <T : Any> FriendlyByteBuf.readType(registry: IdMap<T>): T {
val id = readInt()
return registry.byId(id) ?: throw NoSuchElementException("No such entry with ID $id")
}
fun FriendlyByteBuf.readBlockType(): Block {
return readType(BuiltInRegistries.BLOCK)
}
fun FriendlyByteBuf.readItemType(): Item { fun FriendlyByteBuf.readItemType(): Item {
return BuiltInRegistries.ITEM.byId(readInt()) return readType(BuiltInRegistries.ITEM)
} }
fun RegistryFriendlyByteBuf.readItem(): ItemStack { fun RegistryFriendlyByteBuf.readItem(): ItemStack {

View File

@ -8,19 +8,42 @@ import com.mojang.datafixers.util.Either
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.JsonOps import com.mojang.serialization.JsonOps
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.ChatFormatting
import net.minecraft.core.registries.BuiltInRegistries import net.minecraft.core.registries.BuiltInRegistries
import net.minecraft.core.registries.Registries import net.minecraft.core.registries.Registries
import net.minecraft.network.FriendlyByteBuf
import net.minecraft.network.codec.StreamCodec
import net.minecraft.network.protocol.common.custom.CustomPacketPayload
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.server.packs.resources.ResourceManager import net.minecraft.server.packs.resources.ResourceManager
import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener
import net.minecraft.tags.BlockTags
import net.minecraft.tags.TagKey import net.minecraft.tags.TagKey
import net.minecraft.util.profiling.ProfilerFiller import net.minecraft.util.profiling.ProfilerFiller
import net.minecraft.world.item.BlockItem
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import net.neoforged.neoforge.event.AddReloadListenerEvent import net.neoforged.neoforge.event.AddReloadListenerEvent
import net.neoforged.neoforge.event.OnDatapackSyncEvent
import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent
import net.neoforged.neoforge.network.PacketDistributor
import net.neoforged.neoforge.network.handling.IPayloadContext
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.SERVER_IS_LIVE
import ru.dbotthepony.mc.otm.client.isShiftDown
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.core.ResourceLocation
import ru.dbotthepony.mc.otm.core.TextComponent
import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.core.math.readDecimal
import ru.dbotthepony.mc.otm.core.math.writeDecimal
import ru.dbotthepony.mc.otm.core.readBlockType
import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.registryName
import ru.dbotthepony.mc.otm.core.util.formatPower
import ru.dbotthepony.mc.otm.core.writeBlockType
import ru.dbotthepony.mc.otm.data.codec.DecimalCodec import ru.dbotthepony.mc.otm.data.codec.DecimalCodec
import ru.dbotthepony.mc.otm.data.codec.minRange import ru.dbotthepony.mc.otm.data.codec.minRange
@ -57,6 +80,36 @@ object FlywheelMaterials : SimpleJsonResourceReloadListener(GsonBuilder().setPre
return 1 return 1
} }
} }
fun write(stream: FriendlyByteBuf) {
stream.writeBoolean(id.left().isPresent)
id
.ifLeft { stream.writeResourceLocation(it.location) }
.ifRight { stream.writeBlockType(it) }
stream.writeDecimal(storage)
stream.writeVarInt(priority)
stream.writeBoolean(receiveEfficiency != Decimal.ONE)
if (receiveEfficiency != Decimal.ONE) stream.writeDecimal(receiveEfficiency)
stream.writeBoolean(momentumLossSpeed != Decimal.ONE)
if (momentumLossSpeed != Decimal.ONE) stream.writeDecimal(momentumLossSpeed)
}
}
private fun readEntry(stream: FriendlyByteBuf): Entry {
val id: Either<TagKey<Block>, Block> = if (stream.readBoolean()) {
Either.left(BlockTags.create(stream.readResourceLocation()))
} else {
Either.right(stream.readBlockType())
}
val storage = stream.readDecimal()
val priority = stream.readVarInt()
val receiveEfficiency = if (stream.readBoolean()) stream.readDecimal() else Decimal.ONE
val momentumLossSpeed = if (stream.readBoolean()) stream.readDecimal() else Decimal.ONE
return Entry(id, storage, priority, receiveEfficiency, momentumLossSpeed)
} }
private var elements = ArrayList<Entry>() private var elements = ArrayList<Entry>()
@ -149,5 +202,62 @@ object FlywheelMaterials : SimpleJsonResourceReloadListener(GsonBuilder().setPre
event.addListener(this) event.addListener(this)
} }
val SYNC_TYPE = CustomPacketPayload.Type<SyncPacket>(ResourceLocation(OverdriveThatMatters.MOD_ID, "flywheel_materials_sync"))
val SYNC_CODEC: StreamCodec<FriendlyByteBuf, SyncPacket> = StreamCodec.ofMember(SyncPacket::write, ::readSyncPacket)
private fun readSyncPacket(buff: FriendlyByteBuf): SyncPacket {
return SyncPacket(buff.readList { readEntry(it) })
}
class SyncPacket(val elements: List<Entry>) : CustomPacketPayload {
override fun type(): CustomPacketPayload.Type<out CustomPacketPayload> {
return SYNC_TYPE
}
fun write(stream: FriendlyByteBuf) {
stream.writeCollection(elements) { s, entry -> entry.write(s) }
}
fun play(context: IPayloadContext) {
if (SERVER_IS_LIVE)
return // singleplayer or LAN host
FlywheelMaterials.elements = ArrayList(elements)
mappingChanged = true
}
}
fun onDataPackSync(event: OnDatapackSyncEvent) {
if (event.player == null) {
PacketDistributor.sendToAllPlayers(SyncPacket(elements))
} else {
PacketDistributor.sendToPlayer(event.player as ServerPlayer, SyncPacket(elements))
}
}
fun tooltipEvent(event: ItemTooltipEvent) {
if (minecraft.window.isShiftDown) {
val item = event.itemStack.item
if (item is BlockItem) {
val entry = this[item.block]
if (entry != null) {
event.toolTip.add(TextComponent(""))
event.toolTip.add(TranslatableComponent("otm.gui.flywheel.top").withStyle(ChatFormatting.GRAY))
event.toolTip.add(TranslatableComponent("otm.gui.flywheel.storage", entry.storage.formatPower()).withStyle(ChatFormatting.GRAY))
if (entry.receiveEfficiency != Decimal.ONE) {
event.toolTip.add(TranslatableComponent("otm.gui.flywheel.receive_efficiency", entry.receiveEfficiency.toString(1)).withStyle(ChatFormatting.GRAY))
}
if (entry.momentumLossSpeed != Decimal.ONE) {
event.toolTip.add(TranslatableComponent("otm.gui.flywheel.momentum_loss_speed", entry.momentumLossSpeed.toString(1)).withStyle(ChatFormatting.GRAY))
}
}
}
}
}
private val LOGGER = LogManager.getLogger() private val LOGGER = LogManager.getLogger()
} }

View File

@ -5,6 +5,7 @@ import net.neoforged.neoforge.network.registration.HandlerThread
import ru.dbotthepony.mc.otm.android.AndroidResearchManager import ru.dbotthepony.mc.otm.android.AndroidResearchManager
import ru.dbotthepony.mc.otm.android.feature.ItemEntityDataPacket import ru.dbotthepony.mc.otm.android.feature.ItemEntityDataPacket
import ru.dbotthepony.mc.otm.compat.vanilla.InventoryScrollPacket import ru.dbotthepony.mc.otm.compat.vanilla.InventoryScrollPacket
import ru.dbotthepony.mc.otm.data.FlywheelMaterials
import ru.dbotthepony.mc.otm.item.QuantumBatteryItem import ru.dbotthepony.mc.otm.item.QuantumBatteryItem
import ru.dbotthepony.mc.otm.matter.MatterManager import ru.dbotthepony.mc.otm.matter.MatterManager
import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.menu.MatteryMenu
@ -35,6 +36,7 @@ fun registerNetworkPackets(event: RegisterPayloadHandlersEvent) {
r.executesOn(HandlerThread.NETWORK) r.executesOn(HandlerThread.NETWORK)
.playToClient(AndroidResearchManager.SYNC_TYPE, AndroidResearchManager.SYNC_CODEC, AndroidResearchManager.SyncPacket::play) .playToClient(AndroidResearchManager.SYNC_TYPE, AndroidResearchManager.SYNC_CODEC, AndroidResearchManager.SyncPacket::play)
.playToClient(MatterManager.SYNC_TYPE, MatterManager.SYNC_CODEC, MatterManager.SyncPacket::play) .playToClient(MatterManager.SYNC_TYPE, MatterManager.SYNC_CODEC, MatterManager.SyncPacket::play)
.playToClient(FlywheelMaterials.SYNC_TYPE, FlywheelMaterials.SYNC_CODEC, FlywheelMaterials.SyncPacket::play)
// exopack // exopack
r r