From 3be03014591ff34ca8d2252993fe94da627f5c19 Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 12 Feb 2026 19:45:30 +0900 Subject: [PATCH 1/4] feat: add ktoml as dependency --- build.gradle.kts | 1 + gradle/libs.versions.toml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 0cadbec..2ad5a12 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -47,6 +47,7 @@ dependencies { implementation(libs.kotlin.stdlib) implementation(libs.yamlkt) implementation(libs.fastboard) + implementation(libs.bundles.ktoml) } // Project Settings diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 19e58cf..4f23a33 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,6 +13,7 @@ cloudPaper = "2.0.0-SNAPSHOT" jspecify = "1.0.0" yamlkt = "0.13.0" fastboard = "2.1.5" +ktoml = "0.7.1" [plugins] shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } @@ -33,3 +34,9 @@ cloudPaper = { module = "org.incendo:cloud-paper", version.ref = "cloudPaper" } jspecify = { module = "org.jspecify:jspecify", version.ref = "jspecify" } yamlkt = { module = "net.mamoe.yamlkt:yamlkt", version.ref = "yamlkt" } fastboard = { module = "fr.mrmicky:fastboard", version.ref = "fastboard" } +ktoml-core = { module = "com.akuleshov7:ktoml-core", version.ref = "ktoml"} + +[bundles] +ktoml = [ + "ktoml-core" +] From 22871ae755db4d76fe946ff4caa6029be785b635 Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 12 Feb 2026 19:45:43 +0900 Subject: [PATCH 2/4] feat: implement daily login bonus --- .../sclat/api/serializer/UUIDSerializer.kt | 23 ++++++++++ .../be4rjp/sclat/api/utils/DayRefreshSet.kt | 44 +++++++++++++++++++ src/main/kotlin/be4rjp/sclat/config/Config.kt | 33 ++++++++++++++ .../be4rjp/sclat/config/LoginBonusConfig.kt | 9 ++++ .../be4rjp/sclat/extension/LocalDate.kt | 8 ++++ .../kotlin/be4rjp/sclat/extension/ZoneId.kt | 8 ++++ .../be4rjp/sclat/loginbonus/LoginBonus.kt | 31 +++++++++++++ .../kotlin/be4rjp/sclat/manager/GameMgr.kt | 6 +++ 8 files changed, 162 insertions(+) create mode 100644 src/main/kotlin/be4rjp/sclat/api/serializer/UUIDSerializer.kt create mode 100644 src/main/kotlin/be4rjp/sclat/api/utils/DayRefreshSet.kt create mode 100644 src/main/kotlin/be4rjp/sclat/config/LoginBonusConfig.kt create mode 100644 src/main/kotlin/be4rjp/sclat/extension/LocalDate.kt create mode 100644 src/main/kotlin/be4rjp/sclat/extension/ZoneId.kt create mode 100644 src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt diff --git a/src/main/kotlin/be4rjp/sclat/api/serializer/UUIDSerializer.kt b/src/main/kotlin/be4rjp/sclat/api/serializer/UUIDSerializer.kt new file mode 100644 index 0000000..7821112 --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/api/serializer/UUIDSerializer.kt @@ -0,0 +1,23 @@ +package be4rjp.sclat.api.serializer + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import java.util.UUID + +object UUIDSerializer : KSerializer { + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("UUID", PrimitiveKind.STRING) + + override fun serialize( + encoder: Encoder, + value: UUID, + ) { + encoder.encodeString(value.toString()) + } + + override fun deserialize(decoder: Decoder): UUID = UUID.fromString(decoder.decodeString()) +} diff --git a/src/main/kotlin/be4rjp/sclat/api/utils/DayRefreshSet.kt b/src/main/kotlin/be4rjp/sclat/api/utils/DayRefreshSet.kt new file mode 100644 index 0000000..11dd278 --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/api/utils/DayRefreshSet.kt @@ -0,0 +1,44 @@ +@file:UseSerializers(UUIDSerializer::class) + +package be4rjp.sclat.api.utils + +import be4rjp.sclat.api.serializer.UUIDSerializer +import be4rjp.sclat.extension.ZONE_TOKYO +import kotlinx.serialization.Serializable +import kotlinx.serialization.UseSerializers +import java.time.ZonedDateTime +import java.time.temporal.ChronoUnit +import java.util.UUID + +@Serializable +data class DayRefreshSet( + var nextResetEpoch: Long = 0L, + var uuids: MutableSet = mutableSetOf(), +) { + private fun calculateNextReset(): Long = + ZonedDateTime + .now(ZONE_TOKYO) + .truncatedTo(ChronoUnit.DAYS) // today 00:00:00 + .plusDays(1) // tomorrow 00:00:00 + .toInstant() + .toEpochMilli() + + private fun checkRefresh() { + if (System.currentTimeMillis() >= nextResetEpoch) { + uuids.clear() + nextResetEpoch = calculateNextReset() + } + } + + operator fun plus(uuid: UUID) { + checkRefresh() + uuids.add(uuid) + } + + operator fun minus(uuid: UUID) { + checkRefresh() + uuids.remove(uuid) + } + + operator fun contains(uuid: UUID) = uuids.contains(uuid) +} diff --git a/src/main/kotlin/be4rjp/sclat/config/Config.kt b/src/main/kotlin/be4rjp/sclat/config/Config.kt index fcc5909..2b4280d 100644 --- a/src/main/kotlin/be4rjp/sclat/config/Config.kt +++ b/src/main/kotlin/be4rjp/sclat/config/Config.kt @@ -1,5 +1,10 @@ package be4rjp.sclat.config +import com.akuleshov7.ktoml.Toml +import com.akuleshov7.ktoml.TomlIndentation +import com.akuleshov7.ktoml.TomlInputConfig +import com.akuleshov7.ktoml.TomlOutputConfig +import kotlinx.serialization.decodeFromString import org.bukkit.Bukkit import org.bukkit.configuration.file.FileConfiguration import org.bukkit.configuration.file.YamlConfiguration @@ -31,6 +36,9 @@ class Config { private set var emblemUserdata: FileConfiguration? = null private set + + lateinit var loginBonusConfig: LoginBonusConfig + private set private val parent = File("plugins/Sclat") private val psf = File(parent, "class.yml") private val weaponf = File(parent, "mainnweapon.yml") @@ -45,6 +53,9 @@ class Config { private val emblemItemsFile = File(parent, "emblem_items.yml") private val emblemUserDataFile = File(parent, "emblem_userdata.yml") + // Toml config area + private val loginBonusConfigFile = File(parent, "login_bonus.toml") + @Synchronized fun loadConfig() { this.classConfig = YamlConfiguration.loadConfiguration(psf) @@ -60,6 +71,7 @@ class Config { tryCreateFile(emblemUserDataFile) loadEmblemUserData() loadEmblemLoreData() + loginBonusConfig = loadToml(loginBonusConfigFile) } @Synchronized @@ -72,6 +84,8 @@ class Config { emblemItems = YamlConfiguration.loadConfiguration(emblemItemsFile) } + private inline fun loadToml(file: File): T = toml.decodeFromString(file.readText()) + private fun tryCreateFile(targetFile: File) { try { if (!targetFile.exists()) targetFile.createNewFile() @@ -106,4 +120,23 @@ class Config { val uUIDCash: FileConfiguration get() = idCash!! + + companion object { + val toml = + Toml( + inputConfig = + TomlInputConfig( + ignoreUnknownNames = true, + allowEmptyValues = true, + allowNullValues = true, + allowEscapedQuotesInLiteralStrings = true, + allowEmptyToml = true, + ignoreDefaultValues = false, + ), + outputConfig = + TomlOutputConfig( + indentation = TomlIndentation.NONE, + ), + ) + } } diff --git a/src/main/kotlin/be4rjp/sclat/config/LoginBonusConfig.kt b/src/main/kotlin/be4rjp/sclat/config/LoginBonusConfig.kt new file mode 100644 index 0000000..c2f6ac1 --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/config/LoginBonusConfig.kt @@ -0,0 +1,9 @@ +package be4rjp.sclat.config + +import kotlinx.serialization.Serializable + +@Serializable +data class LoginBonusConfig( + val money: Int = 5000, + val ticket: Int = 50, +) diff --git a/src/main/kotlin/be4rjp/sclat/extension/LocalDate.kt b/src/main/kotlin/be4rjp/sclat/extension/LocalDate.kt new file mode 100644 index 0000000..a3b3b4e --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/extension/LocalDate.kt @@ -0,0 +1,8 @@ +package be4rjp.sclat.extension + +import java.time.LocalDate +import java.time.format.DateTimeFormatter + +val SIMPLE_DATE_FORMATTER: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + +fun LocalDate.toSimpleFormat(): String = this.format(SIMPLE_DATE_FORMATTER) diff --git a/src/main/kotlin/be4rjp/sclat/extension/ZoneId.kt b/src/main/kotlin/be4rjp/sclat/extension/ZoneId.kt new file mode 100644 index 0000000..67b53c0 --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/extension/ZoneId.kt @@ -0,0 +1,8 @@ +package be4rjp.sclat.extension + +import java.time.LocalDate +import java.time.ZoneId + +val ZONE_TOKYO: ZoneId = ZoneId.of("Asia/Tokyo") + +fun ZoneId.toLocalDate(): LocalDate = LocalDate.now(this) diff --git a/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt b/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt new file mode 100644 index 0000000..8d6376a --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt @@ -0,0 +1,31 @@ +package be4rjp.sclat.loginbonus + +import be4rjp.sclat.Sclat +import be4rjp.sclat.api.utils.DayRefreshSet +import be4rjp.sclat.manager.PlayerStatusMgr +import org.bukkit.entity.Player +import java.util.UUID + +object LoginBonus { + val refreshSet: DayRefreshSet = DayRefreshSet() + + fun isClaimable(playerUUID: UUID) = playerUUID !in refreshSet + + fun markClaimed(playerUUID: UUID) = refreshSet.plus(playerUUID) + + fun unmarkClaimed(playerUUID: UUID) = refreshSet.minus(playerUUID) + + /** + * Try to claim daily login bonus + * + * @param player target player + * @return is succeeded + */ + fun tryClaim(player: Player): Boolean { + if (!isClaimable(player.uniqueId)) return false + PlayerStatusMgr.addMoney(player, Sclat.conf!!.loginBonusConfig.money) + PlayerStatusMgr.addTicket(player, Sclat.conf!!.loginBonusConfig.ticket) + markClaimed(player.uniqueId) + return true + } +} diff --git a/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt b/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt index 63c81d1..b2f0af9 100644 --- a/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt +++ b/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt @@ -24,6 +24,7 @@ import be4rjp.sclat.data.DataMgr.sprinklerMap import be4rjp.sclat.data.PaintData import be4rjp.sclat.gui.LootBox import be4rjp.sclat.gui.OpenGUI +import be4rjp.sclat.loginbonus.LoginBonus import be4rjp.sclat.packet.PacketHandler import be4rjp.sclat.plugin import be4rjp.sclat.server.EquipmentClient @@ -130,12 +131,17 @@ class GameMgr : Listener { Sclat.conf!! .uUIDCash .set(player.uniqueId.toString(), player.name) + + // On lobby handling if (Sclat.type == ServerType.LOBBY) { // Add user-specific hologram // RankingHolograms rankingHolograms = new RankingHolograms(player); // DataMgr.setRankingHolograms(player, rankingHolograms); // PlayerStatusMgr.HologramUpdateRunnable(player); Sclat.playerHolograms.add(player) + if (LoginBonus.tryClaim(player)) { + player.sendMessage("ログインボーナス! お金 +${Sclat.conf!!.loginBonusConfig.money} & チケット +${Sclat.conf!!.loginBonusConfig.ticket}") + } } if (Sclat.type != ServerType.MATCH) { From 8b53523d44f3e92e25fe128dc6b53255b8fbf8fb Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 12 Feb 2026 21:37:27 +0900 Subject: [PATCH 3/4] feat: implement bonus with NewConfig.kt --- src/main/kotlin/be4rjp/sclat/Sclat.kt | 5 ++- src/main/kotlin/be4rjp/sclat/config/Config.kt | 29 ------------- ...nusConfig.kt => LoginBonusRewardConfig.kt} | 2 +- .../kotlin/be4rjp/sclat/config/NewConfig.kt | 43 +++++++++++++++++++ .../kotlin/be4rjp/sclat/extension/Toml.kt | 33 ++++++++++++++ .../be4rjp/sclat/loginbonus/LoginBonus.kt | 6 +-- .../kotlin/be4rjp/sclat/manager/GameMgr.kt | 5 ++- 7 files changed, 88 insertions(+), 35 deletions(-) rename src/main/kotlin/be4rjp/sclat/config/{LoginBonusConfig.kt => LoginBonusRewardConfig.kt} (80%) create mode 100644 src/main/kotlin/be4rjp/sclat/config/NewConfig.kt create mode 100644 src/main/kotlin/be4rjp/sclat/extension/Toml.kt diff --git a/src/main/kotlin/be4rjp/sclat/Sclat.kt b/src/main/kotlin/be4rjp/sclat/Sclat.kt index ff2e34c..4ec104b 100644 --- a/src/main/kotlin/be4rjp/sclat/Sclat.kt +++ b/src/main/kotlin/be4rjp/sclat/Sclat.kt @@ -16,6 +16,7 @@ import be4rjp.sclat.api.holo.PlayerHolograms import be4rjp.sclat.api.utils.TextAnimation import be4rjp.sclat.commands.SclatCommandExecutor import be4rjp.sclat.config.Config +import be4rjp.sclat.config.NewConfig import be4rjp.sclat.data.DataMgr import be4rjp.sclat.data.DataMgr.armorStandMap import be4rjp.sclat.data.DataMgr.blockDataMap @@ -99,7 +100,8 @@ class Sclat : // --------------------------Load config------------------------------ sclatLogger.info("Loading config files...") conf = Config() - conf!!.loadConfig() + conf?.loadConfig() + NewConfig.load() for (mapname in conf!!.mapConfig!!.getConfigurationSection("Maps")!!.getKeys(false)) { val worldName: String? = conf!!.mapConfig!!.getString("Maps." + mapname + ".WorldName") Bukkit.createWorld(WorldCreator(worldName!!)) @@ -396,6 +398,7 @@ class Sclat : */ for (`as` in armorStandMap.keys) `as`!!.remove() conf!!.saveConfig() + NewConfig.save() for (`as` in DataMgr.al) `as`!!.remove() diff --git a/src/main/kotlin/be4rjp/sclat/config/Config.kt b/src/main/kotlin/be4rjp/sclat/config/Config.kt index 2b4280d..832f564 100644 --- a/src/main/kotlin/be4rjp/sclat/config/Config.kt +++ b/src/main/kotlin/be4rjp/sclat/config/Config.kt @@ -1,10 +1,5 @@ package be4rjp.sclat.config -import com.akuleshov7.ktoml.Toml -import com.akuleshov7.ktoml.TomlIndentation -import com.akuleshov7.ktoml.TomlInputConfig -import com.akuleshov7.ktoml.TomlOutputConfig -import kotlinx.serialization.decodeFromString import org.bukkit.Bukkit import org.bukkit.configuration.file.FileConfiguration import org.bukkit.configuration.file.YamlConfiguration @@ -37,8 +32,6 @@ class Config { var emblemUserdata: FileConfiguration? = null private set - lateinit var loginBonusConfig: LoginBonusConfig - private set private val parent = File("plugins/Sclat") private val psf = File(parent, "class.yml") private val weaponf = File(parent, "mainnweapon.yml") @@ -53,9 +46,6 @@ class Config { private val emblemItemsFile = File(parent, "emblem_items.yml") private val emblemUserDataFile = File(parent, "emblem_userdata.yml") - // Toml config area - private val loginBonusConfigFile = File(parent, "login_bonus.toml") - @Synchronized fun loadConfig() { this.classConfig = YamlConfiguration.loadConfiguration(psf) @@ -71,7 +61,6 @@ class Config { tryCreateFile(emblemUserDataFile) loadEmblemUserData() loadEmblemLoreData() - loginBonusConfig = loadToml(loginBonusConfigFile) } @Synchronized @@ -84,8 +73,6 @@ class Config { emblemItems = YamlConfiguration.loadConfiguration(emblemItemsFile) } - private inline fun loadToml(file: File): T = toml.decodeFromString(file.readText()) - private fun tryCreateFile(targetFile: File) { try { if (!targetFile.exists()) targetFile.createNewFile() @@ -122,21 +109,5 @@ class Config { get() = idCash!! companion object { - val toml = - Toml( - inputConfig = - TomlInputConfig( - ignoreUnknownNames = true, - allowEmptyValues = true, - allowNullValues = true, - allowEscapedQuotesInLiteralStrings = true, - allowEmptyToml = true, - ignoreDefaultValues = false, - ), - outputConfig = - TomlOutputConfig( - indentation = TomlIndentation.NONE, - ), - ) } } diff --git a/src/main/kotlin/be4rjp/sclat/config/LoginBonusConfig.kt b/src/main/kotlin/be4rjp/sclat/config/LoginBonusRewardConfig.kt similarity index 80% rename from src/main/kotlin/be4rjp/sclat/config/LoginBonusConfig.kt rename to src/main/kotlin/be4rjp/sclat/config/LoginBonusRewardConfig.kt index c2f6ac1..935ea75 100644 --- a/src/main/kotlin/be4rjp/sclat/config/LoginBonusConfig.kt +++ b/src/main/kotlin/be4rjp/sclat/config/LoginBonusRewardConfig.kt @@ -3,7 +3,7 @@ package be4rjp.sclat.config import kotlinx.serialization.Serializable @Serializable -data class LoginBonusConfig( +data class LoginBonusRewardConfig( val money: Int = 5000, val ticket: Int = 50, ) diff --git a/src/main/kotlin/be4rjp/sclat/config/NewConfig.kt b/src/main/kotlin/be4rjp/sclat/config/NewConfig.kt new file mode 100644 index 0000000..23f0b02 --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/config/NewConfig.kt @@ -0,0 +1,43 @@ +package be4rjp.sclat.config + +import be4rjp.sclat.extension.loadToml +import be4rjp.sclat.extension.saveToml +import be4rjp.sclat.sclatLogger +import java.io.File +import java.util.function.Supplier + +/** + * Migrating from Config.kt + */ +object NewConfig { + private val parent = File("plugins/Sclat") + lateinit var loginBonusReward: LoginBonusRewardConfig + private set + + fun load() { + sclatLogger.info(">>> Loading config...") + loginBonusReward = loadTomlConfig("login_bonus", ::LoginBonusRewardConfig) + sclatLogger.info("<<< All config loaded.") + } + + fun save() { + sclatLogger.info(">>> Saving config...") + + sclatLogger.info("<<< All config saved.") + } + + private inline fun loadTomlConfig( + name: String, + default: Supplier, + ): T = + parent.resolve("$name.toml").let { file -> + if (!file.exists()) { + saveToml(file, default.get()).also { + sclatLogger.warn("${file.name} was missing. Wrote default config.") + } + } + loadToml(file).also { + sclatLogger.info("-> Config ${file.name} loaded!") + } + } +} diff --git a/src/main/kotlin/be4rjp/sclat/extension/Toml.kt b/src/main/kotlin/be4rjp/sclat/extension/Toml.kt new file mode 100644 index 0000000..0d9b6de --- /dev/null +++ b/src/main/kotlin/be4rjp/sclat/extension/Toml.kt @@ -0,0 +1,33 @@ +package be4rjp.sclat.extension + +import com.akuleshov7.ktoml.Toml +import com.akuleshov7.ktoml.TomlIndentation +import com.akuleshov7.ktoml.TomlInputConfig +import com.akuleshov7.ktoml.TomlOutputConfig +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import java.io.File + +val toml = + Toml( + inputConfig = + TomlInputConfig( + ignoreUnknownNames = true, + allowEmptyValues = true, + allowNullValues = true, + allowEscapedQuotesInLiteralStrings = true, + allowEmptyToml = true, + ignoreDefaultValues = false, + ), + outputConfig = + TomlOutputConfig( + indentation = TomlIndentation.NONE, + ), + ) + +inline fun loadToml(file: File): T = toml.decodeFromString(file.readText()) + +inline fun saveToml( + file: File, + value: T, +) = file.writeText(toml.encodeToString(value)) diff --git a/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt b/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt index 8d6376a..179edd7 100644 --- a/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt +++ b/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt @@ -1,7 +1,7 @@ package be4rjp.sclat.loginbonus -import be4rjp.sclat.Sclat import be4rjp.sclat.api.utils.DayRefreshSet +import be4rjp.sclat.config.NewConfig import be4rjp.sclat.manager.PlayerStatusMgr import org.bukkit.entity.Player import java.util.UUID @@ -23,8 +23,8 @@ object LoginBonus { */ fun tryClaim(player: Player): Boolean { if (!isClaimable(player.uniqueId)) return false - PlayerStatusMgr.addMoney(player, Sclat.conf!!.loginBonusConfig.money) - PlayerStatusMgr.addTicket(player, Sclat.conf!!.loginBonusConfig.ticket) + PlayerStatusMgr.addMoney(player, NewConfig.loginBonusReward.money) + PlayerStatusMgr.addTicket(player, NewConfig.loginBonusReward.ticket) markClaimed(player.uniqueId) return true } diff --git a/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt b/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt index b2f0af9..f77b1b4 100644 --- a/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt +++ b/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt @@ -8,6 +8,7 @@ import be4rjp.sclat.api.ServerType import be4rjp.sclat.api.SoundType import be4rjp.sclat.api.player.PlayerData import be4rjp.sclat.api.player.PlayerSettings +import be4rjp.sclat.config.NewConfig import be4rjp.sclat.data.DataMgr import be4rjp.sclat.data.DataMgr.beaconMap import be4rjp.sclat.data.DataMgr.getBeaconFromplayer @@ -140,7 +141,9 @@ class GameMgr : Listener { // PlayerStatusMgr.HologramUpdateRunnable(player); Sclat.playerHolograms.add(player) if (LoginBonus.tryClaim(player)) { - player.sendMessage("ログインボーナス! お金 +${Sclat.conf!!.loginBonusConfig.money} & チケット +${Sclat.conf!!.loginBonusConfig.ticket}") + player.sendMessage( + "ログインボーナス! お金 +${NewConfig.loginBonusReward.money} & チケット +${NewConfig.loginBonusReward.ticket}", + ) } } From d76bc5e834503ca83d63840da7bbdda049826fe5 Mon Sep 17 00:00:00 2001 From: sysnote8main Date: Thu, 12 Feb 2026 21:52:58 +0900 Subject: [PATCH 4/4] feat: save claimed state for LoginBonus --- .../{DayRefreshSet.kt => DailyRefreshSet.kt} | 2 +- src/main/kotlin/be4rjp/sclat/config/NewConfig.kt | 15 ++++++++++++++- .../kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt | 5 +++-- src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt | 2 +- 4 files changed, 19 insertions(+), 5 deletions(-) rename src/main/kotlin/be4rjp/sclat/api/utils/{DayRefreshSet.kt => DailyRefreshSet.kt} (97%) diff --git a/src/main/kotlin/be4rjp/sclat/api/utils/DayRefreshSet.kt b/src/main/kotlin/be4rjp/sclat/api/utils/DailyRefreshSet.kt similarity index 97% rename from src/main/kotlin/be4rjp/sclat/api/utils/DayRefreshSet.kt rename to src/main/kotlin/be4rjp/sclat/api/utils/DailyRefreshSet.kt index 11dd278..0c94f3e 100644 --- a/src/main/kotlin/be4rjp/sclat/api/utils/DayRefreshSet.kt +++ b/src/main/kotlin/be4rjp/sclat/api/utils/DailyRefreshSet.kt @@ -11,7 +11,7 @@ import java.time.temporal.ChronoUnit import java.util.UUID @Serializable -data class DayRefreshSet( +data class DailyRefreshSet( var nextResetEpoch: Long = 0L, var uuids: MutableSet = mutableSetOf(), ) { diff --git a/src/main/kotlin/be4rjp/sclat/config/NewConfig.kt b/src/main/kotlin/be4rjp/sclat/config/NewConfig.kt index 23f0b02..0eb50d4 100644 --- a/src/main/kotlin/be4rjp/sclat/config/NewConfig.kt +++ b/src/main/kotlin/be4rjp/sclat/config/NewConfig.kt @@ -1,7 +1,9 @@ package be4rjp.sclat.config +import be4rjp.sclat.api.utils.DailyRefreshSet import be4rjp.sclat.extension.loadToml import be4rjp.sclat.extension.saveToml +import be4rjp.sclat.loginbonus.LoginBonus import be4rjp.sclat.sclatLogger import java.io.File import java.util.function.Supplier @@ -17,15 +19,26 @@ object NewConfig { fun load() { sclatLogger.info(">>> Loading config...") loginBonusReward = loadTomlConfig("login_bonus", ::LoginBonusRewardConfig) + LoginBonus.refreshSet = loadTomlConfig("login_bonus_claimed", ::DailyRefreshSet) sclatLogger.info("<<< All config loaded.") } fun save() { sclatLogger.info(">>> Saving config...") - + saveTomlConfig("login_bonus_claimed", LoginBonus.refreshSet) sclatLogger.info("<<< All config saved.") } + private inline fun saveTomlConfig( + name: String, + value: T, + ) { + parent.resolve("$name.toml").let { file -> + saveToml(file, value) + sclatLogger.info("-> Config ${file.name} saved!") + } + } + private inline fun loadTomlConfig( name: String, default: Supplier, diff --git a/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt b/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt index 179edd7..8b59dd2 100644 --- a/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt +++ b/src/main/kotlin/be4rjp/sclat/loginbonus/LoginBonus.kt @@ -1,13 +1,14 @@ package be4rjp.sclat.loginbonus -import be4rjp.sclat.api.utils.DayRefreshSet +import be4rjp.sclat.api.utils.DailyRefreshSet import be4rjp.sclat.config.NewConfig import be4rjp.sclat.manager.PlayerStatusMgr import org.bukkit.entity.Player import java.util.UUID object LoginBonus { - val refreshSet: DayRefreshSet = DayRefreshSet() + var refreshSet: DailyRefreshSet = DailyRefreshSet() + internal set fun isClaimable(playerUUID: UUID) = playerUUID !in refreshSet diff --git a/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt b/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt index f77b1b4..e275ced 100644 --- a/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt +++ b/src/main/kotlin/be4rjp/sclat/manager/GameMgr.kt @@ -142,7 +142,7 @@ class GameMgr : Listener { Sclat.playerHolograms.add(player) if (LoginBonus.tryClaim(player)) { player.sendMessage( - "ログインボーナス! お金 +${NewConfig.loginBonusReward.money} & チケット +${NewConfig.loginBonusReward.ticket}", + "${ChatColor.GOLD}ログインボーナス!${ChatColor.WHITE} お金 ${ChatColor.GREEN}+${NewConfig.loginBonusReward.money}${ChatColor.WHITE} & チケット ${ChatColor.GREEN}+${NewConfig.loginBonusReward.ticket}${ChatColor.WHITE}", ) } }