IMaterialItem
This commit is contained in:
parent
b21bd50e7b
commit
f76530e5b6
@ -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!" }
|
||||
|
@ -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}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package ru.dbotthepony.kstarbound.defs.item
|
||||
|
||||
import ru.dbotthepony.kstarbound.defs.MaterialReference
|
||||
|
||||
interface IMaterialItem : IItemDefinition {
|
||||
/**
|
||||
* То, какой материал (блок) из себя представляет данный предмет
|
||||
*/
|
||||
val material: MaterialReference
|
||||
}
|
@ -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
|
@ -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()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user