From f76530e5b60f4f728b2805dd2b3b89f18ee25bd3 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Wed, 4 Jan 2023 15:45:52 +0700 Subject: [PATCH] IMaterialItem --- .../ru/dbotthepony/kstarbound/Starbound.kt | 9 ++- .../kstarbound/defs/MaterialReference.kt | 36 ++++++++++++ .../kstarbound/defs/item/IMaterialItem.kt | 10 ++++ .../defs/item/MaterialItemDefinition.kt | 28 ++++++++++ .../defs/item/MaterialItemPrototype.kt | 56 +++++++++++++++++++ 5 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/MaterialReference.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IMaterialItem.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemDefinition.kt create mode 100644 src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemPrototype.kt diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt index 7e74d20d..0b2b38be 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt @@ -27,6 +27,7 @@ import ru.dbotthepony.kstarbound.defs.item.ItemPrototype import ru.dbotthepony.kstarbound.defs.item.ItemRarity import ru.dbotthepony.kstarbound.defs.item.ItemTooltipKind import ru.dbotthepony.kstarbound.defs.item.LeveledStatusEffect +import ru.dbotthepony.kstarbound.defs.item.MaterialItemPrototype import ru.dbotthepony.kstarbound.defs.liquid.LiquidDefinition import ru.dbotthepony.kstarbound.defs.projectile.* import ru.dbotthepony.kstarbound.defs.tile.MaterialModifier @@ -172,6 +173,7 @@ object Starbound { .registerTypeAdapter(ItemPrototype.ADAPTER) .registerTypeAdapter(CurrencyItemPrototype.ADAPTER) .registerTypeAdapter(ArmorItemPrototype.ADAPTER) + .registerTypeAdapter(MaterialItemPrototype.ADAPTER) .registerTypeAdapter(IItemDefinition.InventoryIcon.ADAPTER) .registerTypeAdapter(IFossilItemDefinition.FossilSetDescription.ADAPTER) @@ -286,6 +288,7 @@ object Starbound { ) { val time = System.currentTimeMillis() callback(false, false, "Loading $name...") + LOGGER.info("Loading $name...") loader { if (terminateLoading) { @@ -296,6 +299,7 @@ object Starbound { } callback(false, true, "Loaded $name in ${System.currentTimeMillis() - time}ms") + LOGGER.info("Loaded $name in ${System.currentTimeMillis() - time}ms") } fun initializeGame(callback: (finished: Boolean, replaceStatus: Boolean, status: String) -> Unit) { @@ -512,7 +516,7 @@ object Starbound { } private fun loadItemDefinitions(callback: (String) -> Unit) { - val files = listOf(".item", ".currency", ".head", ".chest", ".legs", ".back", ".activeitem") + val files = listOf(".item", ".currency", ".head", ".chest", ".legs", ".back", ".activeitem", ".matitem") for (fs in fileSystems) { for (listedFile in fs.explore().filter { it.isFile }.filter { f -> files.any { f.name.endsWith(it) } }) { @@ -524,6 +528,9 @@ object Starbound { if (listedFile.name.endsWith(".item")) { val def = GSON.fromJson(listedFile.reader(), ItemPrototype::class.java) check(items.put(def.itemName, def.assemble()) == null) { "Already has item with name ${def.itemName} loaded!" } + } else if (listedFile.name.endsWith(".matitem")) { + val def = GSON.fromJson(listedFile.reader(), MaterialItemPrototype::class.java) + check(items.put(def.itemName, def.assemble()) == null) { "Already has item with name ${def.itemName} loaded!" } } else if (listedFile.name.endsWith(".currency")) { val def = GSON.fromJson(listedFile.reader(), CurrencyItemPrototype::class.java) check(items.put(def.itemName, def.assemble()) == null) { "Already has item with name ${def.itemName} loaded!" } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/MaterialReference.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/MaterialReference.kt new file mode 100644 index 00000000..a5e6415d --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/MaterialReference.kt @@ -0,0 +1,36 @@ +package ru.dbotthepony.kstarbound.defs + +import com.google.gson.JsonSyntaxException +import com.google.gson.TypeAdapter +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonToken +import com.google.gson.stream.JsonWriter + +data class MaterialReference( + val id: Int?, + val name: String? +) { + init { + require(id != null || name != null) { "At least ID or material string ID should be not null" } + } + + companion object : TypeAdapter() { + override fun write(out: JsonWriter, value: MaterialReference) { + if (value.id != null) { + out.value(value.id) + } else { + out.value(value.name!!) + } + } + + override fun read(`in`: JsonReader): MaterialReference { + if (`in`.peek() == JsonToken.NUMBER) { + return MaterialReference(id = `in`.nextInt(), name = null) + } else if (`in`.peek() == JsonToken.STRING) { + return MaterialReference(id = null, name = `in`.nextString()) + } else { + throw JsonSyntaxException("Invalid material reference: ${`in`.peek()} (must be either an Integer or String), near ${`in`.path}") + } + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IMaterialItem.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IMaterialItem.kt new file mode 100644 index 00000000..62d6413f --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IMaterialItem.kt @@ -0,0 +1,10 @@ +package ru.dbotthepony.kstarbound.defs.item + +import ru.dbotthepony.kstarbound.defs.MaterialReference + +interface IMaterialItem : IItemDefinition { + /** + * То, какой материал (блок) из себя представляет данный предмет + */ + val material: MaterialReference +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemDefinition.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemDefinition.kt new file mode 100644 index 00000000..1b54bee9 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemDefinition.kt @@ -0,0 +1,28 @@ +package ru.dbotthepony.kstarbound.defs.item + +import ru.dbotthepony.kstarbound.defs.MaterialReference + +data class MaterialItemDefinition( + override val shortdescription: String, + override val description: String, + override val itemName: String, + override val price: Long, + override val rarity: ItemRarity, + override val category: String?, + override val inventoryIcon: List?, + override val itemTags: List, + override val learnBlueprintsOnPickup: List, + override val maxStack: Long, + override val eventCategory: String?, + override val consumeOnPickup: Boolean, + override val pickupQuestTemplates: List, + override val scripts: List, + override val tooltipKind: ItemTooltipKind, + override val twoHanded: Boolean, + override val radioMessagesOnPickup: List, + override val fuelAmount: Long?, + + override val material: MaterialReference, + + val json: Map +) : IMaterialItem diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemPrototype.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemPrototype.kt new file mode 100644 index 00000000..e2deabf7 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/MaterialItemPrototype.kt @@ -0,0 +1,56 @@ +package ru.dbotthepony.kstarbound.defs.item + +import ru.dbotthepony.kstarbound.defs.MaterialReference +import ru.dbotthepony.kstarbound.defs.enrollMap +import ru.dbotthepony.kstarbound.io.json.BuilderAdapter + +class MaterialItemPrototype : ItemPrototype() { + var material: MaterialReference? = null + + var materialId: Int? + get() = material?.id + set(value) { + if (material == null) + material = MaterialReference(id = value, name = null) + } + + var materialName: String? + get() = material?.name + set(value) { material = MaterialReference(name = value, id = null) } + + override fun assemble(): IItemDefinition { + return MaterialItemDefinition( + shortdescription = shortdescription, + description = description, + itemName = itemName, + price = price, + rarity = rarity, + category = category, + inventoryIcon = inventoryIcon, + itemTags = itemTags, + learnBlueprintsOnPickup = learnBlueprintsOnPickup, + maxStack = maxStack, + eventCategory = eventCategory, + consumeOnPickup = consumeOnPickup, + pickupQuestTemplates = pickupQuestTemplates, + scripts = scripts, + tooltipKind = tooltipKind, + twoHanded = twoHanded, + radioMessagesOnPickup = radioMessagesOnPickup, + fuelAmount = fuelAmount, + + material = checkNotNull(material) { "Material is null (either 'materialId' or 'materialName' should be present, or 'material' itself)" }, + + json = enrollMap(json), + ) + } + + companion object { + val ADAPTER = BuilderAdapter.Builder(::MaterialItemPrototype) + .also { addFields(it as BuilderAdapter.Builder) } // безопасность: свойства родительского класса объявлены как final + .auto(MaterialItemPrototype::material) + .auto(MaterialItemPrototype::materialId) + .auto(MaterialItemPrototype::materialName) + .build() + } +}