From a80ced4cf16d9631a9e5fd83e85faca112f49bd5 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Fri, 2 Feb 2024 20:21:36 +0100 Subject: [PATCH] optimize reflection usafe KUtil 1.26 got some fancy new reflection utilities. Now used. Still depends on KUtil 1.26.1 (for field::type) --- .../blocks/types/pixlyzer/PixLyzerBlock.kt | 5 ++-- .../entity/PixLyzerBlockWithEntity.kt | 5 ++-- .../registries/item/items/block/BlockItem.kt | 4 +-- .../items/block/legacy/PixLyzerBlockItem.kt | 5 ++-- .../registries/registry/RegistryItem.kt | 30 ++++++++++++------- .../rendering/tint/tints/grass/GrassTinted.kt | 6 ++-- 6 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt index 74e79ed2e..7610cb91a 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -21,6 +21,7 @@ import de.bixilon.kutil.json.JsonUtil.asJsonObject import de.bixilon.kutil.primitive.BooleanUtil.toBoolean import de.bixilon.kutil.primitive.FloatUtil.toFloat import de.bixilon.kutil.primitive.IntUtil.toInt +import de.bixilon.kutil.reflection.ReflectionUtil.field import de.bixilon.kutil.reflection.ReflectionUtil.jvmField import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactories import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory @@ -128,7 +129,7 @@ open class PixLyzerBlock( companion object : IdentifierCodec, PixLyzerBlockFactory, MultiClassFactory { private val NULL_OFFSET_XYZ = Vec3i(0, 0, 0).getWorldOffset(RandomOffsetTypes.XYZ) private val NULL_OFFSET_XZ = Vec3i(0, 0, 0).getWorldOffset(RandomOffsetTypes.XZ) - private val ITEM_FIELD = PixLyzerBlock::item.jvmField + private val ITEM_FIELD = PixLyzerBlock::item.jvmField.field override val ALIASES: Set = setOf("Block") override fun deserialize(registries: Registries?, identifier: ResourceLocation, data: Map): Block { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/PixLyzerBlockWithEntity.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/PixLyzerBlockWithEntity.kt index 5b00ad255..f3d10c8f4 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/PixLyzerBlockWithEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/PixLyzerBlockWithEntity.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.entity import de.bixilon.kutil.cast.CastUtil.unsafeNull +import de.bixilon.kutil.reflection.ReflectionUtil.field import de.bixilon.kutil.reflection.ReflectionUtil.jvmField import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.registries.blocks.entites.BlockEntityType @@ -35,6 +36,6 @@ abstract class PixLyzerBlockWithEntity(resourceLocation: Resour override fun createBlockEntity(connection: PlayConnection) = blockEntity?.factory?.build(connection) private companion object { - val FACTORY_FIELD = PixLyzerBlockWithEntity<*>::blockEntity.jvmField + val FACTORY_FIELD = PixLyzerBlockWithEntity<*>::blockEntity.jvmField.field } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/BlockItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/BlockItem.kt index 5b060a98a..d6b45d5c0 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/BlockItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/BlockItem.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -44,6 +44,6 @@ abstract class BlockItem(identifier: ResourceLocation) : Item(identif private companion object { - private val BLOCK_FIELD = BlockItem<*>::block.jvmField + private val BLOCK_FIELD = BlockItem<*>::block.jvmField.field } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/legacy/PixLyzerBlockItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/legacy/PixLyzerBlockItem.kt index 6e1b9243e..d7836207b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/legacy/PixLyzerBlockItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/item/items/block/legacy/PixLyzerBlockItem.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.registries.item.items.block.legacy import de.bixilon.kutil.cast.CastUtil.unsafeNull +import de.bixilon.kutil.reflection.ReflectionUtil.field import de.bixilon.kutil.reflection.ReflectionUtil.jvmField import de.bixilon.minosoft.camera.target.targets.BlockTarget import de.bixilon.minosoft.data.container.stack.ItemStack @@ -52,7 +53,7 @@ open class PixLyzerBlockItem( companion object : PixLyzerItemFactory, MultiClassFactory { override val ALIASES = setOf("BlockItem", "AliasedBlockItem") - private val BLOCK_FIELD = PixLyzerBlockItem::block.jvmField + private val BLOCK_FIELD = PixLyzerBlockItem::block.jvmField.field override fun build(resourceLocation: ResourceLocation, registries: Registries, data: Map): PixLyzerBlockItem { return PixLyzerBlockItem(resourceLocation, registries, data) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/RegistryItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/RegistryItem.kt index 95ec9694a..69e5ac42e 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/RegistryItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/registries/registry/RegistryItem.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -14,8 +14,9 @@ package de.bixilon.minosoft.data.registries.registries.registry import de.bixilon.kutil.cast.CastUtil.unsafeNull -import de.bixilon.kutil.reflection.ReflectionUtil.forceSet +import de.bixilon.kutil.reflection.ReflectionUtil.field import de.bixilon.kutil.reflection.ReflectionUtil.jvmField +import de.bixilon.kutil.reflection.wrapper.ObjectField import de.bixilon.minosoft.data.registries.identified.Identified import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries @@ -24,14 +25,16 @@ import kotlin.reflect.KProperty abstract class RegistryItem : Identified { open val injectable: Boolean get() = true - private val injects: MutableMap> = if (injectable) hashMapOf() else unsafeNull() + private val injects: MutableMap> = if (injectable) hashMapOf() else unsafeNull() fun KProperty.inject(vararg keys: Any?): T { return this.jvmField.inject(*keys) } - fun Field.inject(vararg keys: Any?): T { + fun ObjectField.inject(vararg keys: Any?): T { if (!injectable) throw IllegalStateException("Not injectable") + if (keys.isEmpty()) return unsafeNull() + val list: MutableList = ArrayList(keys.size) for (key in keys) { if (key == null) continue @@ -40,21 +43,26 @@ abstract class RegistryItem : Identified { if (list.isEmpty()) return unsafeNull() injects[this] = list return unsafeNull() + + } + + fun Field.inject(vararg keys: Any?): T { + return this.field.inject(*keys) } fun inject(registries: Registries) { - if (!injectable) { - return - } + if (!injectable || injects.isEmpty()) return + for ((field, keys) in injects) { var value: Any? = null for (key in keys) { - value = registries[field.type as Class]?.get(key) ?: continue + val registry = registries[field.type as Class] ?: continue + value = registry[key] ?: continue break } - value ?: continue + if (value == null) continue - field.forceSet(this, value) + field.set(this, value) } INJECTS_FIELD.set(this, null) @@ -79,6 +87,6 @@ abstract class RegistryItem : Identified { } companion object { - private val INJECTS_FIELD = RegistryItem::injects.jvmField + private val INJECTS_FIELD = RegistryItem::injects.jvmField.field } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/tint/tints/grass/GrassTinted.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/tint/tints/grass/GrassTinted.kt index 37d2787e4..2948e0fdc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/tint/tints/grass/GrassTinted.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/tint/tints/grass/GrassTinted.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2024 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -14,13 +14,13 @@ package de.bixilon.minosoft.gui.rendering.tint.tints.grass import de.bixilon.kutil.reflection.ReflectionUtil.forceSet -import de.bixilon.kutil.reflection.ReflectionUtil.getFieldOrNull +import de.bixilon.kutil.reflection.ReflectionUtil.getUnsafeField import de.bixilon.minosoft.gui.rendering.tint.TintManager import de.bixilon.minosoft.gui.rendering.tint.TintedBlock interface GrassTinted : TintedBlock { override fun initTint(manager: TintManager) { - this::class.java.getFieldOrNull("tintProvider")!!.forceSet(this, manager.grass) + this::class.java.getUnsafeField("tintProvider").forceSet(this, manager.grass) } }