IMaterialItem

This commit is contained in:
DBotThePony 2023-01-04 15:45:52 +07:00
parent b21bd50e7b
commit f76530e5b6
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 138 additions and 1 deletions

View File

@ -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!" }

View File

@ -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<MaterialReference>() {
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}")
}
}
}
}

View File

@ -0,0 +1,10 @@
package ru.dbotthepony.kstarbound.defs.item
import ru.dbotthepony.kstarbound.defs.MaterialReference
interface IMaterialItem : IItemDefinition {
/**
* То, какой материал (блок) из себя представляет данный предмет
*/
val material: MaterialReference
}

View File

@ -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<IItemDefinition.IInventoryIcon>?,
override val itemTags: List<String>,
override val learnBlueprintsOnPickup: List<String>,
override val maxStack: Long,
override val eventCategory: String?,
override val consumeOnPickup: Boolean,
override val pickupQuestTemplates: List<String>,
override val scripts: List<String>,
override val tooltipKind: ItemTooltipKind,
override val twoHanded: Boolean,
override val radioMessagesOnPickup: List<String>,
override val fuelAmount: Long?,
override val material: MaterialReference,
val json: Map<String, Any>
) : IMaterialItem

View File

@ -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<ItemPrototype>) } // безопасность: свойства родительского класса объявлены как final
.auto(MaterialItemPrototype::material)
.auto(MaterialItemPrototype::materialId)
.auto(MaterialItemPrototype::materialName)
.build()
}
}