improve nbt/json/mbf casting

This commit is contained in:
Bixilon 2021-07-08 22:30:19 +02:00
parent d89685fe15
commit 04aea97d05
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
50 changed files with 193 additions and 184 deletions

View File

@ -19,7 +19,7 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.RGBColor
import de.bixilon.minosoft.util.KUtil.fromJson
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.matthiasmann.twl.utils.PNGDecoder
import org.lwjgl.BufferUtils
import java.io.BufferedReader
@ -52,7 +52,7 @@ interface AssetsManager {
}
fun readJsonAsset(resourceLocation: ResourceLocation): Map<String, Any> {
return readStringAsset(resourceLocation).fromJson().compoundCast()!!
return readStringAsset(resourceLocation).fromJson().asCompound()
}
fun readStringAsset(resourceLocation: ResourceLocation): String {

View File

@ -23,7 +23,8 @@ import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.KUtil.chance
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
import glm_.vec3.Vec3d
import glm_.vec3.Vec3i
@ -48,12 +49,12 @@ class CampfireBlockEntity(connection: PlayConnection) : BlockEntity(connection)
continue
}
val itemStack = ItemStack(
item = connection.registries.itemRegistry[slot["id"]?.nullCast<String>()!!]!!,
item = connection.registries.itemRegistry[slot["id"].unsafeCast<String>()]!!,
connection = connection,
count = slot["Count"]?.nullCast<Number>()?.toInt() ?: 1,
count = slot["Count"]?.toInt() ?: 1,
)
items[slot["Slot"]?.nullCast<Number>()?.toInt()!!] = itemStack
items[slot["Slot"]!!.toInt()] = itemStack
}
}
@ -72,7 +73,7 @@ class CampfireBlockEntity(connection: PlayConnection) : BlockEntity(connection)
}
}
val facing = (blockState.properties[BlockProperties.FACING] as Directions).horizontalId
val facing = blockState.properties[BlockProperties.FACING].unsafeCast<Directions>().horizontalId
for ((index, item) in items.withIndex()) {
item ?: continue

View File

@ -23,7 +23,7 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.center
import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.toInt
import glm_.vec3.Vec3d
import glm_.vec3.Vec3i
import kotlin.random.Random
@ -53,7 +53,7 @@ class MobSpawnerBlockEntity(connection: PlayConnection) : BlockEntity(connection
override fun updateNBT(nbt: Map<String, Any>) {
nbt["MaxNearbyEntities"]?.let {
requiredPlayerRange = nbt["MaxNearbyEntities"]?.nullCast<Number>()?.toInt() ?: 16
requiredPlayerRange = nbt["MaxNearbyEntities"]?.toInt() ?: 16
}
// ToDo: {MaxNearbyEntities: 6s, RequiredPlayerRange: 16s, SpawnCount: 4s, x: -80, y: 4, SpawnData: {id: "minecraft:zombie"}, z: 212, id: "minecraft:mob_spawner", MaxSpawnDelay: 800s, SpawnRange: 4s, Delay: 0s, MinSpawnDelay: 200s}
}

View File

@ -22,7 +22,7 @@ import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.No
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.KUtil.asResourceLocation
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.toInt
import glm_.vec3.Vec3d
import glm_.vec3.Vec3i
@ -59,7 +59,7 @@ class NoteBlockBlockEntity(connection: PlayConnection) : BlockEntity(connection)
noteParticleType?.let {
connection.world += NoteParticle(connection, blockPosition.toVec3d + Vec3d(0.5, 1.2, 0.5), (blockState.properties[BlockProperties.NOTE]?.nullCast<Number>()?.toInt() ?: 0) / 24.0f, it.default())
connection.world += NoteParticle(connection, blockPosition.toVec3d + Vec3d(0.5, 1.2, 0.5), (blockState.properties[BlockProperties.NOTE]?.toInt() ?: 0) / 24.0f, it.default())
}
}

View File

@ -27,7 +27,7 @@ class SignBlockEntity(connection: PlayConnection) : BlockEntity(connection) {
override fun updateNBT(nbt: Map<String, Any>) {
for (i in 0 until ProtocolDefinition.SIGN_LINES) {
val tag = nbt["Text$i"]?.nullCast<String>() ?: continue
val tag = nbt["Text$i"].nullCast<String>() ?: continue
lines[i] = ChatComponent.of(tag, translator = connection.version.localeManager)
}

View File

@ -31,6 +31,7 @@ import de.bixilon.minosoft.data.text.TextFormattable
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.BitByte.isBit
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.getAndRemove
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
@ -63,10 +64,10 @@ data class ItemStack(
return
}
nbt.getAndRemove(REPAIR_COST_TAG)?.nullCast<Number>()?.let { repairCost = it.toInt() }
nbt.getAndRemove(REPAIR_COST_TAG).nullCast<Number>()?.let { repairCost = it.toInt() }
nbt.getAndRemove(DISPLAY_TAG)?.compoundCast()?.let {
it.getAndRemove(DISPLAY_MAME_TAG)?.nullCast<String>()?.let { nameTag ->
it.getAndRemove(DISPLAY_MAME_TAG).nullCast<String>()?.let { nameTag ->
customDisplayName = ChatComponent.of(nameTag, translator = connection?.version?.localeManager)
}
@ -77,15 +78,15 @@ data class ItemStack(
}
}
nbt.getAndRemove(UNBREAKABLE_TAG)?.nullCast<Number>()?.let {
nbt.getAndRemove(UNBREAKABLE_TAG).nullCast<Number>()?.let {
unbreakable = it.toInt() == 0x01
}
nbt.getAndRemove(UNBREAKABLE_TAG)?.nullCast<Number>()?.let {
nbt.getAndRemove(UNBREAKABLE_TAG).nullCast<Number>()?.let {
unbreakable = it.toInt() == 0x01
}
nbt.getAndRemove(HIDE_FLAGS_TAG)?.nullCast<Number>()?.let {
nbt.getAndRemove(HIDE_FLAGS_TAG).nullCast<Number>()?.let {
hideFlags = it.toInt()
}
@ -102,7 +103,7 @@ data class ItemStack(
else -> TODO()
}
}!!
enchantments[enchantment] = enchantmentTag[ENCHANTMENT_LEVEL_TAG]?.nullCast<Number>()?.toInt()!!
enchantments[enchantment] = enchantmentTag[ENCHANTMENT_LEVEL_TAG]!!.toInt()
}
}
}

View File

@ -20,7 +20,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import java.util.*
class MinecraftLocaleManager(private val version: Version) : Translator {
@ -33,7 +33,7 @@ class MinecraftLocaleManager(private val version: Version) : Translator {
private fun loadLanguage(version: Version, language: String): MinecraftLanguage {
return if (version.versionId >= ProtocolVersions.V_18W02A) {
MinecraftLanguage(language, this.version.assetsManager.readJsonAsset(ResourceLocation(String.format("lang/%s.json", language.lowercase(Locale.getDefault())))).compoundCast()!!)
MinecraftLanguage(language, this.version.assetsManager.readJsonAsset(ResourceLocation(String.format("lang/%s.json", language.lowercase(Locale.getDefault())))).asCompound())
} else {
MinecraftLanguage(language, this.version.assetsManager.readStringAsset(ResourceLocation(String.format("lang/%s.lang", language.lowercase(Locale.getDefault())))))
}

View File

@ -147,7 +147,7 @@ class LocalPlayerEntity(
}
val blockState = connection.world[positionInfo.blockPosition] ?: return false
connection.tags[TagsS2CP.BLOCK_TAG_RESOURCE_LOCATION]?.get(CLIMBABLE_TAG)?.nullCast<Tag<Block>>()?.let {
connection.tags[TagsS2CP.BLOCK_TAG_RESOURCE_LOCATION]?.get(CLIMBABLE_TAG).nullCast<Tag<Block>>()?.let {
return it.entries.contains(blockState.block)
}
return DefaultBlockTags.CLIMBABLE.contains(blockState.block.resourceLocation)
@ -159,7 +159,7 @@ class LocalPlayerEntity(
if (isFlyingWithElytra || baseAbilities.isFlying) {
return 1.0
}
val onSoulSpeedBlock = connection.tags[TagsS2CP.BLOCK_TAG_RESOURCE_LOCATION]?.get(SOUL_SPEED_BLOCKS)?.nullCast<Tag<Block>>()?.entries?.contains(connection.world[positionInfo.velocityPosition]?.block) ?: false
val onSoulSpeedBlock = connection.tags[TagsS2CP.BLOCK_TAG_RESOURCE_LOCATION]?.get(SOUL_SPEED_BLOCKS).nullCast<Tag<Block>>()?.entries?.contains(connection.world[positionInfo.velocityPosition]?.block) ?: false
if (onSoulSpeedBlock && getEquipmentEnchant(connection.registries.enchantmentRegistry[DefaultEnchantments.SOUL_SPEED]) > 0) {
// ToDo

View File

@ -27,7 +27,7 @@ import de.bixilon.minosoft.protocol.packets.c2s.play.EntityActionC2SP
import de.bixilon.minosoft.protocol.packets.s2c.play.EntityAnimationS2CP
import de.bixilon.minosoft.protocol.packets.s2c.play.title.TitleS2CF
import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
object DefaultRegistries {
private val ENUM_RESOURCE_LOCATION = ResourceLocation("minosoft:mapping/enums.json")
@ -59,31 +59,31 @@ object DefaultRegistries {
fun load() {
check(!initialized) { "Already initialized!" }
val enumJson = Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(ENUM_RESOURCE_LOCATION).compoundCast()!!.toResourceLocationMap()
val enumJson = Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(ENUM_RESOURCE_LOCATION).asCompound().toResourceLocationMap()
EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("equipment_slots")]?.compoundCast()!!)
HAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("hand_equipment_slots")]?.compoundCast()!!)
ARMOR_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_equipment_slots")]?.compoundCast()!!)
ARMOR_STAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_stand_equipment_slots")]?.compoundCast()!!)
EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("equipment_slots")].asCompound())
HAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("hand_equipment_slots")].asCompound())
ARMOR_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_equipment_slots")].asCompound())
ARMOR_STAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_stand_equipment_slots")].asCompound())
ENTITY_META_DATA_DATA_TYPES_REGISTRY.initialize(enumJson[ResourceLocation("entity_meta_data_data_types")]?.compoundCast()!!)
ENTITY_META_DATA_DATA_TYPES_REGISTRY.initialize(enumJson[ResourceLocation("entity_meta_data_data_types")].asCompound())
TITLE_ACTIONS_REGISTRY.initialize(enumJson[ResourceLocation("title_actions")]?.compoundCast()!!)
TITLE_ACTIONS_REGISTRY.initialize(enumJson[ResourceLocation("title_actions")].asCompound())
ENTITY_ANIMATION_REGISTRY.initialize(enumJson[ResourceLocation("entity_animations")]?.compoundCast()!!)
ENTITY_ACTIONS_REGISTRY.initialize(enumJson[ResourceLocation("entity_actions")]?.compoundCast()!!)
ENTITY_ANIMATION_REGISTRY.initialize(enumJson[ResourceLocation("entity_animations")].asCompound())
ENTITY_ACTIONS_REGISTRY.initialize(enumJson[ResourceLocation("entity_actions")].asCompound())
val registriesJson = Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(REGISTRIES_RESOURCE_LOCATION).compoundCast()!!.toResourceLocationMap()
val registriesJson = Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(REGISTRIES_RESOURCE_LOCATION).asCompound().toResourceLocationMap()
DEFAULT_PLUGIN_CHANNELS_REGISTRY.initialize(registriesJson[ResourceLocation("default_plugin_channels")]?.compoundCast()!!, PluginChannel)
DEFAULT_PLUGIN_CHANNELS_REGISTRY.initialize(registriesJson[ResourceLocation("default_plugin_channels")].asCompound(), PluginChannel)
ENTITY_OBJECT_REGISTRY.rawInitialize(registriesJson[ResourceLocation("entity_objects")]?.compoundCast()!!, null, EntityObjectType)
ENTITY_OBJECT_REGISTRY.rawInitialize(registriesJson[ResourceLocation("entity_objects")].asCompound(), null, EntityObjectType)
BLOCK_ENTITY_META_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation("block_entity_meta_data_types")]?.compoundCast()!!, BlockEntityMetaType)
BLOCK_ENTITY_META_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation("block_entity_meta_data_types")].asCompound(), BlockEntityMetaType)
CONTAINER_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation("container_types")]?.compoundCast()!!, ContainerType)
GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation("game_events")]?.compoundCast()!!, GameEvent)
CONTAINER_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation("container_types")].asCompound(), ContainerType)
GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation("game_events")].asCompound(), GameEvent)
initialized = true
}

View File

@ -76,14 +76,14 @@ data class Dimension(
piglinSafe = data["piglin_safe"]?.booleanCast() ?: false,
natural = data["natural"]?.booleanCast() ?: false,
ambientLight = data["ambient_light"]?.unsafeCast<Float>() ?: 0.0f,
infiniBurn = ResourceLocation(data["infiniburn"]?.nullCast<String>() ?: "infiniburn_overworld"),
infiniBurn = ResourceLocation(data["infiniburn"].nullCast<String>() ?: "infiniburn_overworld"),
respawnAnchorWorks = data["respawn_anchor_works"]?.booleanCast() ?: false,
hasSkyLight = data["has_skylight", "has_sky_light"]?.booleanCast() ?: false,
bedWorks = data["bed_works"]?.booleanCast() ?: false,
effects = ResourceLocation(data["effects"]?.nullCast<String>() ?: "overworld"),
effects = ResourceLocation(data["effects"].nullCast<String>() ?: "overworld"),
hasRaids = data["has_raids"]?.booleanCast() ?: false,
logicalHeight = data["logical_height"]?.toInt() ?: 256,
coordinateScale = data["coordinate_scale"]?.nullCast() ?: 0.0,
coordinateScale = data["coordinate_scale"].nullCast() ?: 0.0,
minY = data["min_y"]?.toInt() ?: 0,
hasCeiling = data["has_ceiling"]?.booleanCast() ?: false,
ultraWarm = data["ultrawarm"]?.booleanCast() ?: false,

View File

@ -31,8 +31,8 @@ data class Motive(
override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): Motive {
return Motive(
resourceLocation = resourceLocation,
width = data["width"]!!.unsafeCast(),
height = data["height"]!!.unsafeCast(),
width = data["width"].unsafeCast(),
height = data["height"].unsafeCast(),
)
}
}

View File

@ -31,7 +31,7 @@ data class PluginChannel(
override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): PluginChannel {
return PluginChannel(
resourceLocation = resourceLocation,
name = LegacyResourceLocation(data["name"]!!.unsafeCast())
name = LegacyResourceLocation(data["name"].unsafeCast())
)
}
}

View File

@ -76,8 +76,8 @@ data class Biome(
skyColor = data["sky_color"]?.toInt()?.asRGBColor() ?: RenderConstants.GRASS_FAILOVER_COLOR,
foliageColorOverride = TintColorCalculator.getJsonColor(data["foliage_color_override"]?.toInt() ?: 0),
grassColorOverride = TintColorCalculator.getJsonColor(data["grass_color_override"]?.toInt() ?: 0),
descriptionId = data["water_fog_color"]?.nullCast(),
grassColorModifier = data["grass_color_modifier"]?.nullCast<String>()?.uppercase(Locale.getDefault())?.let { GrassColorModifiers.valueOf(it) } ?: when (resourceLocation) {
descriptionId = data["water_fog_color"].nullCast(),
grassColorModifier = data["grass_color_modifier"].nullCast<String>()?.uppercase(Locale.getDefault())?.let { GrassColorModifiers.valueOf(it) } ?: when (resourceLocation) {
ResourceLocation("minecraft:swamp"), ResourceLocation("minecraft:swamp_hills") -> GrassColorModifiers.SWAMP
ResourceLocation("minecraft:dark_forest"), ResourceLocation("minecraft:dark_forest_hills") -> GrassColorModifiers.DARK_FOREST
else -> GrassColorModifiers.NONE

View File

@ -25,7 +25,7 @@ data class BiomeCategory(
companion object : IdDeserializer<BiomeCategory> {
override fun deserialize(registries: Registries, data: Map<String, Any>): BiomeCategory {
return BiomeCategory(
name = data["name"]!!.unsafeCast()
name = data["name"].unsafeCast()
)
}

View File

@ -25,7 +25,7 @@ data class BiomePrecipitation(
companion object : IdDeserializer<BiomePrecipitation> {
override fun deserialize(registries: Registries, data: Map<String, Any>): BiomePrecipitation {
return BiomePrecipitation(
name = data["name"]!!.unsafeCast()
name = data["name"].unsafeCast()
)
}
}

View File

@ -28,6 +28,7 @@ import de.bixilon.minosoft.gui.rendering.block.renderable.block.BlockRenderer
import de.bixilon.minosoft.gui.rendering.block.renderable.block.MultipartRenderer
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.booleanCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.vec3.Vec3i
@ -137,12 +138,12 @@ data class BlockState(
for (model in it) {
when (model) {
is Map<*, *> -> {
addBlockModel(model.compoundCast()!!, renderers, models)
addBlockModel(model.asCompound(), renderers, models)
}
is Collection<*> -> {
val modelList: MutableList<WorldEntryRenderer> = mutableListOf()
for (singleModel in model) {
addBlockModel(singleModel!!.compoundCast()!!, modelList, models)
addBlockModel(singleModel!!.asCompound(), modelList, models)
}
renderers.add(MultipartRenderer(modelList.toList()))
}
@ -150,7 +151,7 @@ data class BlockState(
}
}
is Map<*, *> -> {
addBlockModel(it.compoundCast()!!, renderers, models)
addBlockModel(it.asCompound(), renderers, models)
}
else -> error("Not a render json!")
}
@ -159,7 +160,7 @@ data class BlockState(
val tintColor: RGBColor? = data["tint_color"]?.toInt()?.let { TintColorCalculator.getJsonColor(it) } ?: block.tintColor
val material = registries.materialRegistry[ResourceLocation(data["material"]!!.unsafeCast())]!!
val material = registries.materialRegistry[ResourceLocation(data["material"].unsafeCast())]!!
fun Any.asShape(): VoxelShape {
@ -230,7 +231,7 @@ data class BlockState(
}
private fun addBlockModel(data: Map<String, Any>, renderer: MutableList<WorldEntryRenderer>, models: Map<ResourceLocation, BlockModel>) {
val model = models[ResourceLocation(data["model"]!!.unsafeCast())] ?: error("Can not find block model ${data["model"]}")
val model = models[ResourceLocation(data["model"].unsafeCast())] ?: error("Can not find block model ${data["model"]}")
renderer.add(BlockRenderer(data, model))
}
}

View File

@ -35,7 +35,7 @@ import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.toDouble
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import glm_.vec3.Vec3i
import kotlin.random.Random
@ -46,8 +46,8 @@ open class Block(
) : RegistryItem() {
open val explosionResistance: Float = data["explosion_resistance"]?.unsafeCast<Float>() ?: 0.0f
open val tintColor: RGBColor? = data["tint_color"]?.toInt()?.let { TintColorCalculator.getJsonColor(it) }
open val randomOffsetType: RandomOffsetTypes? = data["offset_type"]?.nullCast<String>()?.let { RandomOffsetTypes[it] }
open val tint: ResourceLocation? = data["tint"]?.nullCast<String>()?.let { ResourceLocation(it) }
open val randomOffsetType: RandomOffsetTypes? = data["offset_type"].nullCast<String>()?.let { RandomOffsetTypes[it] }
open val tint: ResourceLocation? = data["tint"].nullCast<String>()?.let { ResourceLocation(it) }
open val renderOverride: List<WorldEntryRenderer>? = null
open var blockEntityType: BlockEntityType? = null
protected set
@ -119,14 +119,14 @@ open class Block(
override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): Block {
check(registries != null) { "Registries is null!" }
val block = DefaultBlockFactories[data["class"]!!.unsafeCast()]?.build(resourceLocation, registries, data) ?: Block(resourceLocation, registries, data)
val block = DefaultBlockFactories[data["class"].unsafeCast()]?.build(resourceLocation, registries, data) ?: Block(resourceLocation, registries, data)
val properties: MutableMap<BlockProperties, MutableSet<Any>> = mutableMapOf()
val states: MutableSet<BlockState> = mutableSetOf()
for ((stateId, stateJson) in data["states"]?.mapCast()!!) {
check(stateJson is Map<*, *>) { "Not a state element!" }
val state = BlockState.deserialize(block, registries, stateJson.compoundCast()!!, registries.models)
val state = BlockState.deserialize(block, registries, stateJson.asCompound(), registries.models)
registries.blockStateRegistry[stateId.toInt()] = state
states.add(state)
for ((property, value) in state.properties) {
@ -141,7 +141,7 @@ open class Block(
}
block.states = states.toSet()
block.defaultState = registries.blockStateRegistry.forceGet(data["default_state"]!!.unsafeCast())!!
block.defaultState = registries.blockStateRegistry.forceGet(data["default_state"].unsafeCast())!!
block.properties = propertiesOut.toMap()
return block
}

View File

@ -22,6 +22,7 @@ import de.bixilon.minosoft.data.text.RGBColor
import de.bixilon.minosoft.data.text.RGBColor.Companion.asRGBColor
import de.bixilon.minosoft.datafixer.EntityAttributeFixer.fix
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import java.util.*
@ -45,7 +46,7 @@ data class StatusEffect(
data["attributes"]?.compoundCast()?.let {
for ((key, value) in it) {
val attribute = StatusEffectAttribute.deserialize(value.compoundCast()!!)
val attribute = StatusEffectAttribute.deserialize(value.asCompound())
attributes[ResourceLocation.getResourceLocation(key).fix()] = attribute
uuidAttributes[attribute.uuid] = attribute
}
@ -53,9 +54,9 @@ data class StatusEffect(
return StatusEffect(
resourceLocation = resourceLocation,
category = StatusEffectCategories[data["category"]!!.unsafeCast<String>()],
category = StatusEffectCategories[data["category"].unsafeCast<String>()],
translationKey = data["translation_key"]?.unsafeCast<String>(),
color = data["color"]!!.unsafeCast<Int>().asRGBColor(),
color = data["color"].unsafeCast<Int>().asRGBColor(),
attributes = attributes.toMap(),
uuidAttributes = uuidAttributes.toMap(),
)

View File

@ -29,10 +29,10 @@ data class StatusEffectAttribute(
companion object {
fun deserialize(data: Map<String, Any>): StatusEffectAttribute {
return StatusEffectAttribute(
name = data["name"]!!.unsafeCast(),
uuid = Util.getUUIDFromString(data["uuid"]!!.unsafeCast()),
amount = data["amount"]!!.unsafeCast(),
operation = StatusEffectOperations[data["operation"]!!.unsafeCast<String>()],
name = data["name"].unsafeCast(),
uuid = Util.getUUIDFromString(data["uuid"].unsafeCast()),
amount = data["amount"].unsafeCast(),
operation = StatusEffectOperations[data["operation"].unsafeCast<String>()],
)
}
}

View File

@ -72,9 +72,9 @@ data class EntityType(
return EntityType(
resourceLocation = resourceLocation,
translationKey = data["translation_key"]?.nullCast(),
width = data["width"]!!.unsafeCast(),
height = data["height"]!!.unsafeCast(),
translationKey = data["translation_key"].nullCast(),
width = data["width"].unsafeCast(),
height = data["height"].unsafeCast(),
fireImmune = data["fire_immune"]?.booleanCast() ?: false,
sizeFixed = data["size_fixed"]?.booleanCast() ?: false,
attributes = attributes.toMap(),

View File

@ -92,7 +92,7 @@ open class Fluid(
override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): Fluid {
check(registries != null) { "Registries is null!" }
DefaultFluidFactories[data["class"]?.nullCast<String>()]?.let {
DefaultFluidFactories[data["class"].nullCast<String>()]?.let {
return it.build(resourceLocation, registries, data)
}

View File

@ -30,9 +30,9 @@ data class CreativeModeTab(
companion object : IdDeserializer<CreativeModeTab> {
override fun deserialize(registries: Registries, data: Map<String, Any>): CreativeModeTab {
return CreativeModeTab(
name = data["language_id"]!!.unsafeCast(),
recipeFolderName = data["recipe_folder_name"]!!.unsafeCast(),
backgroundSuffix = data["background_suffix"]!!.unsafeCast(),
name = data["language_id"].unsafeCast(),
recipeFolderName = data["recipe_folder_name"].unsafeCast(),
backgroundSuffix = data["background_suffix"].unsafeCast(),
canScroll = data["can_scroll"]!!.booleanCast(),
showTitle = data["show_title"]!!.booleanCast(),
)

View File

@ -22,5 +22,5 @@ open class DyeItem(
registries: Registries,
data: Map<String, Any>,
) : Item(resourceLocation, registries, data) {
val dyeColor = data["dye_color"]?.nullCast<String>() ?: "white"
val dyeColor = data["dye_color"].nullCast<String>() ?: "white"
}

View File

@ -42,7 +42,7 @@ open class Item(
val maxStackSize: Int = data["max_stack_size"]?.toInt() ?: 64
val maxDamage: Int = data["max_damage"]?.toInt() ?: 1
val isFireResistant: Boolean = data["is_fire_resistant"]?.booleanCast() ?: false
override val translationKey: String? = data["translation_key"]?.nullCast()
override val translationKey: String? = data["translation_key"].nullCast()
val creativeModeTab: CreativeModeTab? = data["category"]?.toInt()?.let { registries.creativeModeTabRegistry[it] }
override fun toString(): String {
@ -62,7 +62,7 @@ open class Item(
override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): Item {
check(registries != null) { "Registries is null!" }
return when (data["class"]!!.unsafeCast<String>()) {
return when (data["class"].unsafeCast<String>()) {
"BlockItem" -> BlockItem(resourceLocation, registries, data)
"ArmorItem" -> ArmorItem(resourceLocation, registries, data)
"SwordItem" -> SwordItem(resourceLocation, registries, data)

View File

@ -23,7 +23,7 @@ open class MusicDiscItem(
registries: Registries,
data: Map<String, Any>,
) : Item(resourceLocation, registries, data) {
val analogOutput = data["analog_output"]?.nullCast<Item>() ?: 0
val analogOutput = data["analog_output"].nullCast<Item>() ?: 0
val sound: SoundEvent? = null
init {

View File

@ -24,8 +24,8 @@ open class ArmorItem(
registries: Registries,
data: Map<String, Any>,
) : Item(resourceLocation, registries, data) {
val protection = data["defense"]!!.unsafeCast<Float>()
val toughness = data["toughness"]!!.unsafeCast<Float>()
val equipmentSlot = data["equipment_slot"]!!.unsafeCast<String>().let { InventorySlots.EquipmentSlots[it] }
val protection = data["defense"].unsafeCast<Float>()
val toughness = data["toughness"].unsafeCast<Float>()
val equipmentSlot = data["equipment_slot"].unsafeCast<String>().let { InventorySlots.EquipmentSlots[it] }
val knockbackResistance = data["knockback_resistance"]?.unsafeCast<Float>() ?: 0.0f
}

View File

@ -45,7 +45,7 @@ data class Material(
return Material(
resourceLocation = resourceLocation,
color = TintColorCalculator.getJsonColor(data["color"]?.toInt() ?: 0),
pushReaction = data["push_reaction"]?.nullCast<String>()?.let { PushReactions.valueOf(it.uppercase(Locale.getDefault())) } ?: PushReactions.NORMAL,
pushReaction = data["push_reaction"].nullCast<String>()?.let { PushReactions.valueOf(it.uppercase(Locale.getDefault())) } ?: PushReactions.NORMAL,
blockMotion = data["blocks_motion"]?.booleanCast() ?: false,
flammable = data["flammable"]?.booleanCast() ?: false,
liquid = data["liquid"]?.booleanCast() ?: false,

View File

@ -56,7 +56,7 @@ class EnumRegistry<T : Enum<*>>(
val value: T
when (data) {
is Map<*, *> -> {
id = data["id"]!!.unsafeCast()
id = data["id"].unsafeCast()
value = getEnum(data["value"]!!)
}
is String -> {
@ -82,7 +82,7 @@ class EnumRegistry<T : Enum<*>>(
}
is Map<*, *> -> {
for ((index, enum) in data) {
putEnum(enum!!, Integer.valueOf(index!!.unsafeCast<String>()))
putEnum(enum!!, Integer.valueOf(index.unsafeCast<String>()))
}
}
else -> throw IllegalArgumentException("Can not get enum value: $data")

View File

@ -16,7 +16,7 @@ package de.bixilon.minosoft.data.registries.registry
import de.bixilon.minosoft.data.registries.versions.Registries
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.collections.Clearable
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
class FakeEnumRegistry<T : RegistryFakeEnumerable>(
override var parent: FakeEnumRegistry<T>? = null,
@ -49,7 +49,7 @@ class FakeEnumRegistry<T : RegistryFakeEnumerable>(
check(value is Map<*, *>)
var itemId = id.toInt()
val item = deserializer.deserialize(registries, value.compoundCast()!!)
val item = deserializer.deserialize(registries, value.asCompound())
value["id"]?.toInt()?.let { providedItemId ->
itemId = providedItemId
}

View File

@ -22,7 +22,7 @@ import de.bixilon.minosoft.util.KUtil.asResourceLocation
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
open class Registry<T : RegistryItem>(
override var parent: AbstractRegistry<T>? = null,
@ -99,7 +99,7 @@ open class Registry<T : RegistryItem>(
for ((resourceLocation, value) in data) {
check(value is Map<*, *>)
val item = deserializer.deserialize(registries, resourceLocation, value.compoundCast()!!) ?: continue
val item = deserializer.deserialize(registries, resourceLocation, value.asCompound()) ?: continue
value["id"]?.toInt()?.let { id ->
var itemId = id
if (!flattened) {
@ -153,7 +153,7 @@ open class Registry<T : RegistryItem>(
for (item in resourceLocationMap.values) {
lambda(item)
}
parent?.nullCast<Registry<T>>()?.forEachItem(lambda)
parent.nullCast<Registry<T>>()?.forEachItem(lambda)
}
override fun toString(): String {

View File

@ -48,6 +48,7 @@ import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.collections.Clearable
import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import java.lang.reflect.Field
import java.lang.reflect.ParameterizedType
@ -182,15 +183,14 @@ class Registries {
// post init
for (field in TYPE_MAP.values) {
val registry = field.get(this) as Registry<*>
registry.postInit(this)
field.get(this).unsafeCast<Registry<*>>().postInit(this)
}
isFullyLoaded = true
}
private fun loadShapes(pixlyzerData: Map<String, Any>?) {
pixlyzerData ?: return
val aabbs = loadAABBs(pixlyzerData["aabbs"]?.nullCast()!!)
val aabbs = loadAABBs(pixlyzerData["aabbs"].nullCast()!!)
loadVoxelShapes(pixlyzerData["shapes"]?.listCast()!!, aabbs)
}
@ -213,7 +213,7 @@ class Registries {
if (models.containsKey(resourceLocation)) {
continue
}
loadBlockModel(resourceLocation, model.compoundCast()!!, data)
loadBlockModel(resourceLocation, model.asCompound(), data)
}
}
@ -223,14 +223,14 @@ class Registries {
return it
}
var parent: BlockModel? = null
modelData["parent"]?.nullCast<String>()?.let {
modelData["parent"].nullCast<String>()?.let {
val parentResourceLocation = ResourceLocation(it)
if (parentResourceLocation.path.startsWith("builtin/")) {
// ToDo
return@let
}
parent = loadBlockModel(parentResourceLocation, fullModelData[parentResourceLocation]?.compoundCast()!!, fullModelData)
parent = loadBlockModel(parentResourceLocation, fullModelData[parentResourceLocation]!!.asCompound(), fullModelData)
}
model = BlockModel(parent, modelData)

View File

@ -26,7 +26,7 @@ import de.bixilon.minosoft.util.CountUpAndDownLatch
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
data class Version(
var versionName: String,
@ -95,7 +95,7 @@ data class Version(
registries.parentRegistries = Versions.PRE_FLATTENING_MAPPING
}
val pixlyzerData = try {
MBFBinaryReader(assetsManager.readAssetAsStream(Resources.getPixLyzerDataHashByVersion(this), false)).readMBF().data?.compoundCast()!!
MBFBinaryReader(assetsManager.readAssetAsStream(Resources.getPixLyzerDataHashByVersion(this), false)).readMBF().data.asCompound()
} catch (exception: Throwable) {
// should not happen, but if this version is not flattened, we can fallback to the flatten mappings. Some things might not work...
Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.VERBOSE) { exception }

View File

@ -107,7 +107,7 @@ class BaseComponent : ChatComponent {
if (colorName.startsWith("#")) {
colorName.asColor()
} else {
ChatCode.FORMATTING_CODES[colorName]?.nullCast<RGBColor>()
ChatCode.FORMATTING_CODES[colorName].nullCast<RGBColor>()
}
} ?: parent?.color

View File

@ -60,7 +60,7 @@ class WorldRenderer(
val renderWindow: RenderWindow,
) : Renderer {
private val world: World = connection.world
private val waterBlock = connection.registries.blockRegistry[ResourceLocation("minecraft:water")]?.nullCast<FluidBlock>()
private val waterBlock = connection.registries.blockRegistry[ResourceLocation("minecraft:water")].nullCast<FluidBlock>()
private val chunkShader: Shader = renderWindow.renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "world"))
private val lightMap = LightMap(connection)

View File

@ -17,6 +17,7 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.rad
import de.bixilon.minosoft.util.KUtil.listCast
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.vec3.Vec3
@ -27,9 +28,9 @@ open class BlockModel(
val textures: Map<String, String>
val elements: List<BlockModelElement>
val rotation: Vec3 = Vec3(data["x"]?.unsafeCast<Double>() ?: parent?.rotation?.x ?: 0.0f, data["y"]?.unsafeCast<Double>() ?: parent?.rotation?.y ?: 0.0f, data["z"]?.unsafeCast<Double>() ?: parent?.rotation?.z ?: 0.0f).rad
val uvLock: Boolean = data["uvlock"]?.nullCast<Boolean>() ?: parent?.uvLock ?: false
val rescale: Boolean = data["rescale"]?.nullCast<Boolean>() ?: parent?.rescale ?: false
val ambientOcclusion: Boolean = data["ambientocclusion"]?.nullCast<Boolean>() ?: parent?.ambientOcclusion ?: true
val uvLock: Boolean = data["uvlock"].nullCast<Boolean>() ?: parent?.uvLock ?: false
val rescale: Boolean = data["rescale"].nullCast<Boolean>() ?: parent?.rescale ?: false
val ambientOcclusion: Boolean = data["ambientocclusion"].nullCast<Boolean>() ?: parent?.ambientOcclusion ?: true
init {
textures = data["textures"]?.compoundCast()?.let {
@ -47,7 +48,7 @@ open class BlockModel(
elements = data["elements"]?.listCast()?.let {
val elements: MutableList<BlockModelElement> = mutableListOf()
for (element in it) {
elements += BlockModelElement(element.compoundCast()!!)
elements += BlockModelElement(element.asCompound())
}
elements.toList()
} ?: parent?.elements ?: listOf()

View File

@ -20,6 +20,7 @@ import de.bixilon.minosoft.gui.rendering.util.VecUtil.rotate
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.func.rad
import glm_.vec3.Vec3
@ -29,7 +30,7 @@ open class BlockModelElement(
) {
val from: Vec3 = data["from"]?.toVec3() ?: Vec3.EMPTY
val to: Vec3 = data["to"]?.toVec3() ?: Vec3(BLOCK_RESOLUTION)
val shade: Boolean = data["shade"]?.nullCast<Boolean>() ?: true
val shade: Boolean = data["shade"].nullCast<Boolean>() ?: true
val faces: MutableMap<Directions, BlockModelFace> = mutableMapOf()
val transformedPositions: Array<Vec3> = arrayOf(
Vec3(from.x, from.y, from.z),
@ -45,16 +46,16 @@ open class BlockModelElement(
init {
data["rotation"]?.compoundCast()?.let {
val axis = Axes[it["axis"]!!.unsafeCast<String>()]
val angle = it["angle"]!!.unsafeCast<Double>().toFloat().rad
val rescale = it["rescale"]?.nullCast<Boolean>() ?: false
val axis = Axes[it["axis"].unsafeCast<String>()]
val angle = it["angle"].unsafeCast<Double>().toFloat().rad
val rescale = it["rescale"].nullCast<Boolean>() ?: false
rotatePositions(transformedPositions, axis, angle, it["origin"]!!.toVec3(), rescale)
}
data["faces"]?.compoundCast()?.let {
for ((directionName, json) in it) {
val direction = Directions[directionName]
faces[direction] = BlockModelFace(json.compoundCast()!!, from, to, direction)
faces[direction] = BlockModelFace(json.asCompound(), from, to, direction)
}
}

View File

@ -42,8 +42,8 @@ class BlockModelFace {
constructor(data: Map<String, Any>, from: Vec3, to: Vec3, direction: Directions) {
tint = data.containsKey("tintindex")
textureName = data["texture"]!!.unsafeCast<String>().removePrefix("#")
cullFace = data["cullface"]?.nullCast<String>()?.let {
textureName = data["texture"].unsafeCast<String>().removePrefix("#")
cullFace = data["cullface"].nullCast<String>()?.let {
if (it == "bottom") {
Directions.DOWN
} else {

View File

@ -58,7 +58,7 @@ class BlockOutlineRenderer(
}
override fun draw() {
val raycastHit = renderWindow.inputHandler.camera.target?.nullCast<BlockRaycastHit>()
val raycastHit = renderWindow.inputHandler.camera.target.nullCast<BlockRaycastHit>()
var currentMesh = currentMesh

View File

@ -21,7 +21,7 @@ import de.bixilon.minosoft.gui.rendering.textures.Texture
import de.bixilon.minosoft.util.KUtil.listCast
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import java.io.InputStream
object FontLoader {
@ -117,12 +117,12 @@ object FontLoader {
}
fun loadFontProvider(data: Map<String, Any>, assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): FontProvider {
return when (data["type"]!!.unsafeCast<String>()) {
return when (data["type"].unsafeCast<String>()) {
"bitmap" -> {
loadBitmapFontProvider(ResourceLocation(data["file"]!!.unsafeCast()), data["height"]?.toInt(), data["ascent"]!!.toInt(), getCharArray(data["chars"]!!.unsafeCast()), assetsManager, textures)
loadBitmapFontProvider(ResourceLocation(data["file"].unsafeCast()), data["height"]?.toInt(), data["ascent"]!!.toInt(), getCharArray(data["chars"].unsafeCast()), assetsManager, textures)
}
"legacy_unicode" -> {
loadUnicodeFontProvider(ResourceLocation(data["template"]!!.unsafeCast()), assetsManager.readAssetAsStream(ResourceLocation(data["sizes"]!!.unsafeCast())), assetsManager, textures)
loadUnicodeFontProvider(ResourceLocation(data["template"].unsafeCast()), assetsManager.readAssetAsStream(ResourceLocation(data["sizes"].unsafeCast())), assetsManager, textures)
}
"ttf" -> {
TODO("True Type Fonts are not implemented yet")
@ -134,8 +134,8 @@ object FontLoader {
fun loadFontProviders(assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): List<FontProvider> {
val ret: MutableList<FontProvider> = mutableListOf()
for (providerElement in assetsManager.readJsonAsset(FONT_JSON_RESOURCE_LOCATION).compoundCast()!!["providers"]!!.listCast()!!) {
val provider = loadFontProvider(providerElement.compoundCast()!!, assetsManager, textures)
for (providerElement in assetsManager.readJsonAsset(FONT_JSON_RESOURCE_LOCATION).asCompound()["providers"]!!.listCast()!!) {
val provider = loadFontProvider(providerElement.asCompound(), assetsManager, textures)
ret.add(provider)
}
return ret

View File

@ -17,6 +17,7 @@ import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.gui.rendering.RenderConstants
import de.bixilon.minosoft.gui.rendering.textures.Texture
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.vec2.Vec2
import glm_.vec2.Vec2i
@ -43,21 +44,21 @@ data class HUDAtlasElement(
fun deserialize(json: Map<ResourceLocation, Any>, textures: MutableMap<ResourceLocation, Texture>): Map<ResourceLocation, HUDAtlasElement> {
val ret: MutableMap<ResourceLocation, HUDAtlasElement> = mutableMapOf()
for ((resourceLocation, data) in json) {
ret[resourceLocation] = deserialize(data.compoundCast()!!, textures)
ret[resourceLocation] = deserialize(data.asCompound(), textures)
}
return ret
}
fun deserialize(json: Map<String, Any>, textures: MutableMap<ResourceLocation, Texture>): HUDAtlasElement {
val keys: MutableSet<Int> = mutableSetOf()
var textureResourceLocation: ResourceLocation? = json["texture"]?.nullCast<String>()?.let { ResourceLocation(it) }
for (key in json["versions"]!!.compoundCast()!!.keys) {
var textureResourceLocation: ResourceLocation? = json["texture"].nullCast<String>()?.let { ResourceLocation(it) }
for (key in json["versions"]!!.asCompound().keys) {
keys.add(key.toInt())
}
// ToDo: Sort and get correct version
val imageJson = json["versions"]!!.compoundCast()!![keys.iterator().next().toString()]!!.compoundCast()!!
val imageJson = json["versions"]!!.asCompound()[keys.iterator().next().toString()]!!.asCompound()
imageJson["texture"]?.nullCast<String>()?.let { textureResourceLocation = ResourceLocation(it) }
imageJson["texture"].nullCast<String>()?.let { textureResourceLocation = ResourceLocation(it) }
val texture = textures.getOrPut(textureResourceLocation!!) { Texture(textureResourceLocation!!) }

View File

@ -238,7 +238,7 @@ class AudioPlayer(
}
is Map<*, *> -> {
sounds += Sound(
path = soundJson["name"]!!.unsafeCast<String>().getSoundLocation(),
path = soundJson["name"].unsafeCast<String>().getSoundLocation(),
volume = soundJson["volume"]?.unsafeCast<Double>()?.toFloat() ?: 1.0f,
pitch = soundJson["pitch"]?.unsafeCast<Double>()?.toFloat() ?: 1.0f,
weight = soundJson["weight"]?.toInt() ?: 1,
@ -253,7 +253,7 @@ class AudioPlayer(
this.sounds[soundEvent] = SoundList(
soundEvent = soundEvent,
sounds = sounds.toSet(),
subTitle = json["subtitle"]?.nullCast<String>()?.let { ResourceLocation(ProtocolDefinition.DEFAULT_NAMESPACE, it) },
subTitle = json["subtitle"].nullCast<String>()?.let { ResourceLocation(ProtocolDefinition.DEFAULT_NAMESPACE, it) },
)
}
}

View File

@ -27,5 +27,5 @@ class CollectItemAnimationEvent(
val count: Int,
) : PlayConnectionEvent(connection, initiator), CancelableEvent {
constructor(connection: PlayConnection, packet: ItemCollectAnimationS2CP) : this(connection, EventInitiators.SERVER, connection.world.entities[packet.itemEntityId]!!.unsafeCast<Entity>(), connection.world.entities[packet.collectorEntityId]!!.unsafeCast<LivingEntity>(), packet.count)
constructor(connection: PlayConnection, packet: ItemCollectAnimationS2CP) : this(connection, EventInitiators.SERVER, connection.world.entities[packet.itemEntityId].unsafeCast<Entity>(), connection.world.entities[packet.collectorEntityId].unsafeCast<LivingEntity>(), packet.count)
}

View File

@ -21,7 +21,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import glm_.vec3.Vec3i
class BlockEntityMetaDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
@ -31,7 +31,7 @@ class BlockEntityMetaDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
buffer.readBlockPosition()
}
val type = buffer.connection.registries.blockEntityMetaDataTypeRegistry[buffer.readUnsignedByte()].resourceLocation
val nbt = buffer.readNBT()?.compoundCast()!!
val nbt = buffer.readNBT().asCompound()
override fun handle(connection: PlayConnection) {
connection.fireEvent(BlockEntityMetaDataChangeEvent(connection, this))

View File

@ -26,13 +26,14 @@ import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.chunk.ChunkUtil
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.vec2.Vec2i
import glm_.vec3.Vec3i
@ -107,9 +108,9 @@ class ChunkDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
if (buffer.versionId >= ProtocolVersions.V_1_9_4) {
val blockEntitiesCount = buffer.readVarInt()
for (i in 0 until blockEntitiesCount) {
val nbt = buffer.readNBT()?.compoundCast()!!
val position = Vec3i(nbt["x"]?.toInt()!!, nbt["y"]?.toInt()!!, nbt["z"]?.toInt()!!)
val resourceLocation = ResourceLocation(nbt["id"]?.nullCast<String>()!!).fix()
val nbt = buffer.readNBT().asCompound()
val position = Vec3i(nbt["x"]!!.toInt(), nbt["y"]!!.toInt(), nbt["z"]!!.toInt())
val resourceLocation = ResourceLocation(nbt["id"].unsafeCast<String>()).fix()
val type = buffer.connection.registries.blockEntityTypeRegistry[resourceLocation] ?: let {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.WARN) { "Unknown block entity: $resourceLocation" }
null

View File

@ -32,10 +32,11 @@ import de.bixilon.minosoft.protocol.protocol.PlayOutByteBuffer
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_20W27A
import de.bixilon.minosoft.util.BitByte
import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
import de.bixilon.minosoft.util.task.time.TimeWorker
@ -97,7 +98,7 @@ class JoinGameS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
if (buffer.versionId < ProtocolVersions.V_20W21A) {
dimension = buffer.connection.registries.dimensionRegistry[buffer.readInt()]
} else {
val dimensionCodec = buffer.readNBT()?.compoundCast()!!
val dimensionCodec = buffer.readNBT().asCompound()
dimensions = parseDimensionCodec(dimensionCodec, buffer.versionId)
if (buffer.versionId < ProtocolVersions.V_1_16_2_PRE3) {
dimension = dimensions[buffer.readResourceLocation()]!!
@ -175,12 +176,12 @@ class JoinGameS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
"key"
} else {
"name"
}]?.nullCast<String>()!!)
}].unsafeCast<String>())
val dimensionPropertyTag = if (versionId < ProtocolVersions.V_1_16_PRE3 || versionId >= ProtocolVersions.V_1_16_2_PRE1) {
tag["element"]?.compoundCast()!!
tag["element"].asCompound()
} else {
tag.compoundCast()
}!!
tag.asCompound()
}
dimensionMap[dimensionResourceLocation] = Dimension.deserialize(null, dimensionResourceLocation, dimensionPropertyTag)
}
return dimensionMap

View File

@ -17,11 +17,11 @@ import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.asCompound
class NBTQueryResponseS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
val transactionId: Int = buffer.readVarInt()
val nbt: Map<String, Any> = buffer.readNBT()?.compoundCast()!!
val nbt: Map<String, Any> = buffer.readNBT().asCompound()
override fun log() {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "NBT query response (transactionId=$transactionId nbt=$nbt)" }

View File

@ -77,32 +77,32 @@ object GitInfo {
try {
val dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ")
val json = Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "git.json"))
GIT_BRANCH = json["git.branch"]!!.unsafeCast()
GIT_BUILD_HOST_BRANCH = json["git.build.host"]!!.unsafeCast()
GIT_BUILD_TIME = dateFormat.parse(json["git.build.time"]!!.unsafeCast()).time
GIT_BUILD_USER_EMAIL = json["git.build.user.email"]!!.unsafeCast()
GIT_BUILD_USER_NAME = json["git.build.user.name"]!!.unsafeCast()
GIT_BUILD_VERSION = json["git.build.version"]!!.unsafeCast()
GIT_CLOSEST_TAG_COMMIT_COUNT = json["git.closest.tag.commit.count"]!!.unsafeCast()
GIT_CLOSEST_TAG_NAME = json["git.closest.tag.name"]!!.unsafeCast()
GIT_COMMIT_ID = json["git.commit.id"]!!.unsafeCast()
GIT_COMMIT_ID_ABBREV = json["git.commit.id.abbrev"]!!.unsafeCast()
GIT_COMMIT_ID_DESCRIBE = json["git.commit.id.describe"]!!.unsafeCast()
GIT_COMMIT_ID_DESCRIBE_SHORT = json["git.commit.id.describe-short"]!!.unsafeCast()
GIT_COMMIT_MESSAGE_FULL = json["git.commit.message.full"]!!.unsafeCast()
GIT_COMMIT_MESSAGE_SHORT = json["git.commit.message.short"]!!.unsafeCast()
GIT_COMMIT_TIME = dateFormat.parse(json["git.commit.time"]!!.unsafeCast()).time
GIT_COMMIT_USER_EMAIL = json["git.commit.user.email"]!!.unsafeCast()
GIT_COMMIT_USER_NAME = json["git.commit.user.name"]!!.unsafeCast()
GIT_BRANCH = json["git.branch"].unsafeCast()
GIT_BUILD_HOST_BRANCH = json["git.build.host"].unsafeCast()
GIT_BUILD_TIME = dateFormat.parse(json["git.build.time"].unsafeCast()).time
GIT_BUILD_USER_EMAIL = json["git.build.user.email"].unsafeCast()
GIT_BUILD_USER_NAME = json["git.build.user.name"].unsafeCast()
GIT_BUILD_VERSION = json["git.build.version"].unsafeCast()
GIT_CLOSEST_TAG_COMMIT_COUNT = json["git.closest.tag.commit.count"].unsafeCast()
GIT_CLOSEST_TAG_NAME = json["git.closest.tag.name"].unsafeCast()
GIT_COMMIT_ID = json["git.commit.id"].unsafeCast()
GIT_COMMIT_ID_ABBREV = json["git.commit.id.abbrev"].unsafeCast()
GIT_COMMIT_ID_DESCRIBE = json["git.commit.id.describe"].unsafeCast()
GIT_COMMIT_ID_DESCRIBE_SHORT = json["git.commit.id.describe-short"].unsafeCast()
GIT_COMMIT_MESSAGE_FULL = json["git.commit.message.full"].unsafeCast()
GIT_COMMIT_MESSAGE_SHORT = json["git.commit.message.short"].unsafeCast()
GIT_COMMIT_TIME = dateFormat.parse(json["git.commit.time"].unsafeCast()).time
GIT_COMMIT_USER_EMAIL = json["git.commit.user.email"].unsafeCast()
GIT_COMMIT_USER_NAME = json["git.commit.user.name"].unsafeCast()
GIT_DIRTY = json["git.dirty"]!!.booleanCast()
GIT_LOCAL_BRANCH_AHEAD = json["git.local.branch.ahead"]!!.unsafeCast()
GIT_LOCAL_BRANCH_BEHIND = json["git.local.branch.behind"]!!.unsafeCast()
GIT_TAGS = if (json["git.tags"]!!.unsafeCast<String>().isBlank()) {
GIT_LOCAL_BRANCH_AHEAD = json["git.local.branch.ahead"].unsafeCast()
GIT_LOCAL_BRANCH_BEHIND = json["git.local.branch.behind"].unsafeCast()
GIT_TAGS = if (json["git.tags"].unsafeCast<String>().isBlank()) {
0
} else {
json["git.tags"]!!.unsafeCast()
json["git.tags"].unsafeCast()
}
GIT_TOTAL_COMMIT_COUNT = json["git.total.commit.count"]!!.unsafeCast()
GIT_TOTAL_COMMIT_COUNT = json["git.total.commit.count"].unsafeCast()
IS_INITIALIZED = true
} catch (exception: Throwable) {

View File

@ -17,7 +17,9 @@ import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonWriter
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.ChatColors
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.data.text.TextComponent
import de.bixilon.minosoft.data.text.TextFormattable
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
@ -55,11 +57,12 @@ object KUtil {
return BitSet.valueOf(longArrayOf(long))
}
fun <T> Any.unsafeCast(): T {
@Suppress("UNCHECKED_CAST")
fun <T> Any?.unsafeCast(): T {
return this as T
}
inline fun <reified T> Any.nullCast(): T? {
inline fun <reified T> Any?.nullCast(): T? {
if (this is T) {
return this
}
@ -179,11 +182,11 @@ object KUtil {
val map: MutableMap<K, V> = mutableMapOf()
for ((key, value) in this) {
map[key] = value as V
map[key] = value.unsafeCast()
}
for (pair in pairs) {
map[pair.first] = pair.second as V
map[pair.first] = pair.second.unsafeCast()
}
return map.toMap()
}
@ -192,39 +195,31 @@ object KUtil {
val list: MutableList<V> = mutableListOf()
for (value in this) {
list += value as V
list += value.unsafeCast<V>()
}
for (value in values) {
list += value as V
list += value.unsafeCast<V>()
}
return list.toList()
}
fun Any?.format(): ChatComponent {
return ChatComponent.of(when (this) {
null -> "§4null"
null -> TextComponent("null").color(ChatColors.DARK_RED)
is TextFormattable -> this.toText()
is Boolean -> {
if (this) {
"§atrue"
} else {
"§cfalse"
}
}
is Boolean -> TextComponent(this.toString()).color(this.decide(ChatColors.GREEN, ChatColors.RED))
is Enum<*> -> {
val name = this.name
"§e" + if (name.length == 1) {
TextComponent(if (name.length == 1) {
name
} else {
name.lowercase()
}
}).color(ChatColors.YELLOW)
}
is Float -> "§d%.3f".format(this)
is Double -> "§d%.4f".format(this)
is Number -> {
"§d$this"
}
is Number -> TextComponent(this).color(ChatColors.LIGHT_PURPLE)
is Vec3t<*> -> "(${this.x.format()} ${this.y.format()} ${this.z.format()})"
is Vec2t<*> -> "(${this.x.format()} ${this.y.format()})"
else -> this.toString()

View File

@ -15,6 +15,7 @@ package de.bixilon.minosoft.util.json
import com.google.gson.JsonObject
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.util.KUtil.unsafeCast
object ResourceLocationJsonMap {
@ -34,7 +35,7 @@ object ResourceLocationJsonMap {
val ret: MutableMap<ResourceLocation, Any> = mutableMapOf()
for ((key, value) in this) {
ret[ResourceLocation(key as String)] = value as Any
ret[ResourceLocation(key.unsafeCast<String>())] = value.unsafeCast<Any>()
}
return ret

View File

@ -27,7 +27,7 @@ object NBTUtil {
return null
}
fun Any.compoundCast(): MutableMap<String, Any>? {
fun Any?.compoundCast(): MutableMap<String, Any>? {
try {
return this as MutableMap<String, Any>
} catch (ignored: ClassCastException) {
@ -35,6 +35,10 @@ object NBTUtil {
return null
}
fun Any?.asCompound(): MutableMap<String, Any> {
return this.compoundCast()!!
}
fun <T> Any.listCast(): MutableList<T>? {
try {
return this as MutableList<T>
@ -44,12 +48,12 @@ object NBTUtil {
}
fun Any.booleanCast(): Boolean {
if (this is Number) {
return this.toInt() == 0x01
}
if (this is Boolean) {
return this
}
if (this is Number) {
return this.toInt() == 0x01
}
TODO()
}