From cc67b10648d5a1e2883208efd96b90c2a8c31e97 Mon Sep 17 00:00:00 2001 From: sya-ri Date: Fri, 26 Feb 2021 19:22:47 +0900 Subject: [PATCH] =?UTF-8?q?api(config):=20ConfigDataType=20=E3=81=AB=20Vec?= =?UTF-8?q?tor=20=E3=81=AE=E8=BF=BD=E5=8A=A0=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spigot/api/config/type/ConfigDataType.kt | 4 + .../config/type/data/ConfigVectorDataType.kt | 83 +++++++++++++++++++ .../data/list/ConfigVectorListDataType.kt | 48 +++++++++++ 3 files changed, 135 insertions(+) create mode 100644 api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/ConfigVectorDataType.kt create mode 100644 api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/list/ConfigVectorListDataType.kt diff --git a/api/src/main/kotlin/com/github/syari/spigot/api/config/type/ConfigDataType.kt b/api/src/main/kotlin/com/github/syari/spigot/api/config/type/ConfigDataType.kt index 15797962..a7235743 100644 --- a/api/src/main/kotlin/com/github/syari/spigot/api/config/type/ConfigDataType.kt +++ b/api/src/main/kotlin/com/github/syari/spigot/api/config/type/ConfigDataType.kt @@ -13,12 +13,14 @@ import com.github.syari.spigot.api.config.type.data.ConfigMaterialDataType import com.github.syari.spigot.api.config.type.data.ConfigNumberDataType import com.github.syari.spigot.api.config.type.data.ConfigStringDataType import com.github.syari.spigot.api.config.type.data.ConfigUUIDDataType +import com.github.syari.spigot.api.config.type.data.ConfigVectorDataType import com.github.syari.spigot.api.config.type.data.ConfigWorldDataType import com.github.syari.spigot.api.config.type.data.list.ConfigCoordinateListDataType import com.github.syari.spigot.api.config.type.data.list.ConfigLocationListDataType import com.github.syari.spigot.api.config.type.data.list.ConfigMaterialListDataType import com.github.syari.spigot.api.config.type.data.list.ConfigStringListDataType import com.github.syari.spigot.api.config.type.data.list.ConfigUUIDListDataType +import com.github.syari.spigot.api.config.type.data.list.ConfigVectorListDataType import com.github.syari.spigot.api.config.type.data.list.ConfigWorldListDataType /** @@ -87,6 +89,8 @@ interface ConfigDataType { val String = ConfigStringDataType val StringList = ConfigStringListDataType val Date = ConfigDateDataType + val Vector = ConfigVectorDataType + val VectorList = ConfigVectorListDataType val Coordinate = ConfigCoordinateDataType val CoordinateList = ConfigCoordinateListDataType val Location = ConfigLocationDataType diff --git a/api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/ConfigVectorDataType.kt b/api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/ConfigVectorDataType.kt new file mode 100644 index 00000000..a83e6082 --- /dev/null +++ b/api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/ConfigVectorDataType.kt @@ -0,0 +1,83 @@ +package com.github.syari.spigot.api.config.type.data + +import com.github.syari.spigot.api.config.CustomConfig +import com.github.syari.spigot.api.config.type.ConfigDataType +import org.bukkit.util.Vector + +/** + * [ConfigDataType.Vector] + * @since 1.4.0 + */ +object ConfigVectorDataType : ConfigDataType { + /** + * データ型の名前 + * @since 1.4.0 + */ + override val typeName = "Vector" + + /** + * @param config [CustomConfig] + * @param path コンフィグパス + * @param notFoundError 存在しないデータの場合にエラーを出す + * @since 1.4.0 + */ + override fun get( + config: CustomConfig, + path: String, + notFoundError: Boolean + ): Vector? { + val line = config.get(path, ConfigDataType.String, notFoundError) ?: return null + return stringToVector(config, path, line) + } + + /** + * @param config [CustomConfig] + * @param path コンフィグパス + * @param value 設定する値 + * @since 1.4.0 + */ + override fun set( + config: CustomConfig, + path: String, + value: Vector? + ) { + if (value != null) { + config.set(path, ConfigDataType.String, vectorToString(value)) + } else { + config.setUnsafe(path, null) + } + } + + /** + * [String] を [Vector] に変換します + * @since 1.4.0 + */ + internal fun stringToVector(config: CustomConfig, path: String, value: String): Vector? { + val element = value.split(",\\s*".toRegex()) + when (element.size) { + 3 -> { + return try { + val x = element[0].toDouble() + val y = element[1].toDouble() + val z = element[2].toDouble() + Vector(x, y, z) + } catch (ex: NumberFormatException) { + config.formatMismatchError(path) + null + } + } + else -> { + config.formatMismatchError(path) + return null + } + } + } + + /** + * [Vector] を [String] に変換します + * @since 1.4.0 + */ + internal fun vectorToString(value: Vector): String { + return "${value.x}, ${value.y}, ${value.z}" + } +} diff --git a/api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/list/ConfigVectorListDataType.kt b/api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/list/ConfigVectorListDataType.kt new file mode 100644 index 00000000..28a3aff8 --- /dev/null +++ b/api/src/main/kotlin/com/github/syari/spigot/api/config/type/data/list/ConfigVectorListDataType.kt @@ -0,0 +1,48 @@ +package com.github.syari.spigot.api.config.type.data.list + +import com.github.syari.spigot.api.config.CustomConfig +import com.github.syari.spigot.api.config.type.ConfigDataType +import com.github.syari.spigot.api.config.type.data.ConfigVectorDataType +import org.bukkit.util.Vector + +/** + * [ConfigDataType.VectorList] + * @since 1.4.0 + */ +object ConfigVectorListDataType : ConfigDataType> { + /** + * データ型の名前 + * @since 1.4.0 + */ + override val typeName = "List" + + /** + * @param config [CustomConfig] + * @param path コンフィグパス + * @param notFoundError 存在しないデータの場合にエラーを出す + * @since 1.4.0 + */ + override fun get( + config: CustomConfig, + path: String, + notFoundError: Boolean + ): List { + return config.get(path, ConfigDataType.StringList, notFoundError)?.mapNotNull { + ConfigVectorDataType.stringToVector(config, "$path.$it", it) + }.orEmpty() + } + + /** + * @param config [CustomConfig] + * @param path コンフィグパス + * @param value 設定する値 + * @since 1.4.0 + */ + override fun set( + config: CustomConfig, + path: String, + value: List? + ) { + config.set(path, ConfigDataType.StringList, value?.map(ConfigVectorDataType::vectorToString)) + } +}