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.data.text.RGBColor
import de.bixilon.minosoft.util.KUtil.fromJson import de.bixilon.minosoft.util.KUtil.fromJson
import de.bixilon.minosoft.util.Util 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 de.matthiasmann.twl.utils.PNGDecoder
import org.lwjgl.BufferUtils import org.lwjgl.BufferUtils
import java.io.BufferedReader import java.io.BufferedReader
@ -52,7 +52,7 @@ interface AssetsManager {
} }
fun readJsonAsset(resourceLocation: ResourceLocation): Map<String, Any> { fun readJsonAsset(resourceLocation: ResourceLocation): Map<String, Any> {
return readStringAsset(resourceLocation).fromJson().compoundCast()!! return readStringAsset(resourceLocation).fromJson().asCompound()
} }
fun readStringAsset(resourceLocation: ResourceLocation): String { 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.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle
import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.KUtil.chance 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 de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
import glm_.vec3.Vec3d import glm_.vec3.Vec3d
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
@ -48,12 +49,12 @@ class CampfireBlockEntity(connection: PlayConnection) : BlockEntity(connection)
continue continue
} }
val itemStack = ItemStack( val itemStack = ItemStack(
item = connection.registries.itemRegistry[slot["id"]?.nullCast<String>()!!]!!, item = connection.registries.itemRegistry[slot["id"].unsafeCast<String>()]!!,
connection = connection, 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()) { for ((index, item) in items.withIndex()) {
item ?: continue 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.plus
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d
import de.bixilon.minosoft.protocol.network.connection.PlayConnection 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.Vec3d
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
import kotlin.random.Random import kotlin.random.Random
@ -53,7 +53,7 @@ class MobSpawnerBlockEntity(connection: PlayConnection) : BlockEntity(connection
override fun updateNBT(nbt: Map<String, Any>) { override fun updateNBT(nbt: Map<String, Any>) {
nbt["MaxNearbyEntities"]?.let { 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} // 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.gui.rendering.util.VecUtil.toVec3d
import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.KUtil.asResourceLocation 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.Vec3d
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
@ -59,7 +59,7 @@ class NoteBlockBlockEntity(connection: PlayConnection) : BlockEntity(connection)
noteParticleType?.let { 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>) { override fun updateNBT(nbt: Map<String, Any>) {
for (i in 0 until ProtocolDefinition.SIGN_LINES) { 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) 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.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.util.BitByte.isBit import de.bixilon.minosoft.util.BitByte.isBit
import de.bixilon.minosoft.util.KUtil.nullCast 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.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.getAndRemove import de.bixilon.minosoft.util.nbt.tag.NBTUtil.getAndRemove
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
@ -63,10 +64,10 @@ data class ItemStack(
return 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 { 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) 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 unbreakable = it.toInt() == 0x01
} }
nbt.getAndRemove(UNBREAKABLE_TAG)?.nullCast<Number>()?.let { nbt.getAndRemove(UNBREAKABLE_TAG).nullCast<Number>()?.let {
unbreakable = it.toInt() == 0x01 unbreakable = it.toInt() == 0x01
} }
nbt.getAndRemove(HIDE_FLAGS_TAG)?.nullCast<Number>()?.let { nbt.getAndRemove(HIDE_FLAGS_TAG).nullCast<Number>()?.let {
hideFlags = it.toInt() hideFlags = it.toInt()
} }
@ -102,7 +103,7 @@ data class ItemStack(
else -> TODO() 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType 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.* import java.util.*
class MinecraftLocaleManager(private val version: Version) : Translator { 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 { private fun loadLanguage(version: Version, language: String): MinecraftLanguage {
return if (version.versionId >= ProtocolVersions.V_18W02A) { 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 { } else {
MinecraftLanguage(language, this.version.assetsManager.readStringAsset(ResourceLocation(String.format("lang/%s.lang", language.lowercase(Locale.getDefault()))))) 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 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 it.entries.contains(blockState.block)
} }
return DefaultBlockTags.CLIMBABLE.contains(blockState.block.resourceLocation) return DefaultBlockTags.CLIMBABLE.contains(blockState.block.resourceLocation)
@ -159,7 +159,7 @@ class LocalPlayerEntity(
if (isFlyingWithElytra || baseAbilities.isFlying) { if (isFlyingWithElytra || baseAbilities.isFlying) {
return 1.0 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) { if (onSoulSpeedBlock && getEquipmentEnchant(connection.registries.enchantmentRegistry[DefaultEnchantments.SOUL_SPEED]) > 0) {
// ToDo // 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.EntityAnimationS2CP
import de.bixilon.minosoft.protocol.packets.s2c.play.title.TitleS2CF import de.bixilon.minosoft.protocol.packets.s2c.play.title.TitleS2CF
import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap 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 { object DefaultRegistries {
private val ENUM_RESOURCE_LOCATION = ResourceLocation("minosoft:mapping/enums.json") private val ENUM_RESOURCE_LOCATION = ResourceLocation("minosoft:mapping/enums.json")
@ -59,31 +59,31 @@ object DefaultRegistries {
fun load() { fun load() {
check(!initialized) { "Already initialized!" } 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()!!) EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("equipment_slots")].asCompound())
HAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("hand_equipment_slots")]?.compoundCast()!!) HAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("hand_equipment_slots")].asCompound())
ARMOR_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_equipment_slots")]?.compoundCast()!!) ARMOR_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_equipment_slots")].asCompound())
ARMOR_STAND_EQUIPMENT_SLOTS_REGISTRY.initialize(enumJson[ResourceLocation("armor_stand_equipment_slots")]?.compoundCast()!!) 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_ANIMATION_REGISTRY.initialize(enumJson[ResourceLocation("entity_animations")].asCompound())
ENTITY_ACTIONS_REGISTRY.initialize(enumJson[ResourceLocation("entity_actions")]?.compoundCast()!!) 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) CONTAINER_TYPE_REGISTRY.initialize(registriesJson[ResourceLocation("container_types")].asCompound(), ContainerType)
GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation("game_events")]?.compoundCast()!!, GameEvent) GAME_EVENT_REGISTRY.initialize(registriesJson[ResourceLocation("game_events")].asCompound(), GameEvent)
initialized = true initialized = true
} }

View File

@ -76,14 +76,14 @@ data class Dimension(
piglinSafe = data["piglin_safe"]?.booleanCast() ?: false, piglinSafe = data["piglin_safe"]?.booleanCast() ?: false,
natural = data["natural"]?.booleanCast() ?: false, natural = data["natural"]?.booleanCast() ?: false,
ambientLight = data["ambient_light"]?.unsafeCast<Float>() ?: 0.0f, 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, respawnAnchorWorks = data["respawn_anchor_works"]?.booleanCast() ?: false,
hasSkyLight = data["has_skylight", "has_sky_light"]?.booleanCast() ?: false, hasSkyLight = data["has_skylight", "has_sky_light"]?.booleanCast() ?: false,
bedWorks = data["bed_works"]?.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, hasRaids = data["has_raids"]?.booleanCast() ?: false,
logicalHeight = data["logical_height"]?.toInt() ?: 256, 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, minY = data["min_y"]?.toInt() ?: 0,
hasCeiling = data["has_ceiling"]?.booleanCast() ?: false, hasCeiling = data["has_ceiling"]?.booleanCast() ?: false,
ultraWarm = data["ultrawarm"]?.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 { override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): Motive {
return Motive( return Motive(
resourceLocation = resourceLocation, resourceLocation = resourceLocation,
width = data["width"]!!.unsafeCast(), width = data["width"].unsafeCast(),
height = data["height"]!!.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 { override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): PluginChannel {
return PluginChannel( return PluginChannel(
resourceLocation = resourceLocation, 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, skyColor = data["sky_color"]?.toInt()?.asRGBColor() ?: RenderConstants.GRASS_FAILOVER_COLOR,
foliageColorOverride = TintColorCalculator.getJsonColor(data["foliage_color_override"]?.toInt() ?: 0), foliageColorOverride = TintColorCalculator.getJsonColor(data["foliage_color_override"]?.toInt() ?: 0),
grassColorOverride = TintColorCalculator.getJsonColor(data["grass_color_override"]?.toInt() ?: 0), grassColorOverride = TintColorCalculator.getJsonColor(data["grass_color_override"]?.toInt() ?: 0),
descriptionId = data["water_fog_color"]?.nullCast(), descriptionId = data["water_fog_color"].nullCast(),
grassColorModifier = data["grass_color_modifier"]?.nullCast<String>()?.uppercase(Locale.getDefault())?.let { GrassColorModifiers.valueOf(it) } ?: when (resourceLocation) { 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:swamp"), ResourceLocation("minecraft:swamp_hills") -> GrassColorModifiers.SWAMP
ResourceLocation("minecraft:dark_forest"), ResourceLocation("minecraft:dark_forest_hills") -> GrassColorModifiers.DARK_FOREST ResourceLocation("minecraft:dark_forest"), ResourceLocation("minecraft:dark_forest_hills") -> GrassColorModifiers.DARK_FOREST
else -> GrassColorModifiers.NONE else -> GrassColorModifiers.NONE

View File

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

View File

@ -25,7 +25,7 @@ data class BiomePrecipitation(
companion object : IdDeserializer<BiomePrecipitation> { companion object : IdDeserializer<BiomePrecipitation> {
override fun deserialize(registries: Registries, data: Map<String, Any>): BiomePrecipitation { override fun deserialize(registries: Registries, data: Map<String, Any>): BiomePrecipitation {
return 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.gui.rendering.block.renderable.block.MultipartRenderer
import de.bixilon.minosoft.util.KUtil.toInt import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast 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.booleanCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
@ -137,12 +138,12 @@ data class BlockState(
for (model in it) { for (model in it) {
when (model) { when (model) {
is Map<*, *> -> { is Map<*, *> -> {
addBlockModel(model.compoundCast()!!, renderers, models) addBlockModel(model.asCompound(), renderers, models)
} }
is Collection<*> -> { is Collection<*> -> {
val modelList: MutableList<WorldEntryRenderer> = mutableListOf() val modelList: MutableList<WorldEntryRenderer> = mutableListOf()
for (singleModel in model) { for (singleModel in model) {
addBlockModel(singleModel!!.compoundCast()!!, modelList, models) addBlockModel(singleModel!!.asCompound(), modelList, models)
} }
renderers.add(MultipartRenderer(modelList.toList())) renderers.add(MultipartRenderer(modelList.toList()))
} }
@ -150,7 +151,7 @@ data class BlockState(
} }
} }
is Map<*, *> -> { is Map<*, *> -> {
addBlockModel(it.compoundCast()!!, renderers, models) addBlockModel(it.asCompound(), renderers, models)
} }
else -> error("Not a render json!") 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 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 { 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>) { 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)) 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.toDouble
import de.bixilon.minosoft.util.KUtil.toInt import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast 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 glm_.vec3.Vec3i
import kotlin.random.Random import kotlin.random.Random
@ -46,8 +46,8 @@ open class Block(
) : RegistryItem() { ) : RegistryItem() {
open val explosionResistance: Float = data["explosion_resistance"]?.unsafeCast<Float>() ?: 0.0f 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 tintColor: RGBColor? = data["tint_color"]?.toInt()?.let { TintColorCalculator.getJsonColor(it) }
open val randomOffsetType: RandomOffsetTypes? = data["offset_type"]?.nullCast<String>()?.let { RandomOffsetTypes[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 tint: ResourceLocation? = data["tint"].nullCast<String>()?.let { ResourceLocation(it) }
open val renderOverride: List<WorldEntryRenderer>? = null open val renderOverride: List<WorldEntryRenderer>? = null
open var blockEntityType: BlockEntityType? = null open var blockEntityType: BlockEntityType? = null
protected set protected set
@ -119,14 +119,14 @@ open class Block(
override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): Block { override fun deserialize(registries: Registries?, resourceLocation: ResourceLocation, data: Map<String, Any>): Block {
check(registries != null) { "Registries is null!" } 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 properties: MutableMap<BlockProperties, MutableSet<Any>> = mutableMapOf()
val states: MutableSet<BlockState> = mutableSetOf() val states: MutableSet<BlockState> = mutableSetOf()
for ((stateId, stateJson) in data["states"]?.mapCast()!!) { for ((stateId, stateJson) in data["states"]?.mapCast()!!) {
check(stateJson is Map<*, *>) { "Not a state element!" } 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 registries.blockStateRegistry[stateId.toInt()] = state
states.add(state) states.add(state)
for ((property, value) in state.properties) { for ((property, value) in state.properties) {
@ -141,7 +141,7 @@ open class Block(
} }
block.states = states.toSet() 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() block.properties = propertiesOut.toMap()
return block 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.data.text.RGBColor.Companion.asRGBColor
import de.bixilon.minosoft.datafixer.EntityAttributeFixer.fix import de.bixilon.minosoft.datafixer.EntityAttributeFixer.fix
import de.bixilon.minosoft.util.KUtil.unsafeCast 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 de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import java.util.* import java.util.*
@ -45,7 +46,7 @@ data class StatusEffect(
data["attributes"]?.compoundCast()?.let { data["attributes"]?.compoundCast()?.let {
for ((key, value) in it) { for ((key, value) in it) {
val attribute = StatusEffectAttribute.deserialize(value.compoundCast()!!) val attribute = StatusEffectAttribute.deserialize(value.asCompound())
attributes[ResourceLocation.getResourceLocation(key).fix()] = attribute attributes[ResourceLocation.getResourceLocation(key).fix()] = attribute
uuidAttributes[attribute.uuid] = attribute uuidAttributes[attribute.uuid] = attribute
} }
@ -53,9 +54,9 @@ data class StatusEffect(
return StatusEffect( return StatusEffect(
resourceLocation = resourceLocation, resourceLocation = resourceLocation,
category = StatusEffectCategories[data["category"]!!.unsafeCast<String>()], category = StatusEffectCategories[data["category"].unsafeCast<String>()],
translationKey = data["translation_key"]?.unsafeCast<String>(), translationKey = data["translation_key"]?.unsafeCast<String>(),
color = data["color"]!!.unsafeCast<Int>().asRGBColor(), color = data["color"].unsafeCast<Int>().asRGBColor(),
attributes = attributes.toMap(), attributes = attributes.toMap(),
uuidAttributes = uuidAttributes.toMap(), uuidAttributes = uuidAttributes.toMap(),
) )

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -45,7 +45,7 @@ data class Material(
return Material( return Material(
resourceLocation = resourceLocation, resourceLocation = resourceLocation,
color = TintColorCalculator.getJsonColor(data["color"]?.toInt() ?: 0), 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, blockMotion = data["blocks_motion"]?.booleanCast() ?: false,
flammable = data["flammable"]?.booleanCast() ?: false, flammable = data["flammable"]?.booleanCast() ?: false,
liquid = data["liquid"]?.booleanCast() ?: false, liquid = data["liquid"]?.booleanCast() ?: false,

View File

@ -56,7 +56,7 @@ class EnumRegistry<T : Enum<*>>(
val value: T val value: T
when (data) { when (data) {
is Map<*, *> -> { is Map<*, *> -> {
id = data["id"]!!.unsafeCast() id = data["id"].unsafeCast()
value = getEnum(data["value"]!!) value = getEnum(data["value"]!!)
} }
is String -> { is String -> {
@ -82,7 +82,7 @@ class EnumRegistry<T : Enum<*>>(
} }
is Map<*, *> -> { is Map<*, *> -> {
for ((index, enum) in data) { 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") 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.data.registries.versions.Registries
import de.bixilon.minosoft.util.KUtil.toInt import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.collections.Clearable 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>( class FakeEnumRegistry<T : RegistryFakeEnumerable>(
override var parent: FakeEnumRegistry<T>? = null, override var parent: FakeEnumRegistry<T>? = null,
@ -49,7 +49,7 @@ class FakeEnumRegistry<T : RegistryFakeEnumerable>(
check(value is Map<*, *>) check(value is Map<*, *>)
var itemId = id.toInt() var itemId = id.toInt()
val item = deserializer.deserialize(registries, value.compoundCast()!!) val item = deserializer.deserialize(registries, value.asCompound())
value["id"]?.toInt()?.let { providedItemId -> value["id"]?.toInt()?.let { providedItemId ->
itemId = 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.nullCast
import de.bixilon.minosoft.util.KUtil.toInt import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap 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>( open class Registry<T : RegistryItem>(
override var parent: AbstractRegistry<T>? = null, override var parent: AbstractRegistry<T>? = null,
@ -99,7 +99,7 @@ open class Registry<T : RegistryItem>(
for ((resourceLocation, value) in data) { for ((resourceLocation, value) in data) {
check(value is Map<*, *>) 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 -> value["id"]?.toInt()?.let { id ->
var itemId = id var itemId = id
if (!flattened) { if (!flattened) {
@ -153,7 +153,7 @@ open class Registry<T : RegistryItem>(
for (item in resourceLocationMap.values) { for (item in resourceLocationMap.values) {
lambda(item) lambda(item)
} }
parent?.nullCast<Registry<T>>()?.forEachItem(lambda) parent.nullCast<Registry<T>>()?.forEachItem(lambda)
} }
override fun toString(): String { 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.KUtil.unsafeCast
import de.bixilon.minosoft.util.collections.Clearable import de.bixilon.minosoft.util.collections.Clearable
import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap 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 de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import java.lang.reflect.Field import java.lang.reflect.Field
import java.lang.reflect.ParameterizedType import java.lang.reflect.ParameterizedType
@ -182,15 +183,14 @@ class Registries {
// post init // post init
for (field in TYPE_MAP.values) { for (field in TYPE_MAP.values) {
val registry = field.get(this) as Registry<*> field.get(this).unsafeCast<Registry<*>>().postInit(this)
registry.postInit(this)
} }
isFullyLoaded = true isFullyLoaded = true
} }
private fun loadShapes(pixlyzerData: Map<String, Any>?) { private fun loadShapes(pixlyzerData: Map<String, Any>?) {
pixlyzerData ?: return pixlyzerData ?: return
val aabbs = loadAABBs(pixlyzerData["aabbs"]?.nullCast()!!) val aabbs = loadAABBs(pixlyzerData["aabbs"].nullCast()!!)
loadVoxelShapes(pixlyzerData["shapes"]?.listCast()!!, aabbs) loadVoxelShapes(pixlyzerData["shapes"]?.listCast()!!, aabbs)
} }
@ -213,7 +213,7 @@ class Registries {
if (models.containsKey(resourceLocation)) { if (models.containsKey(resourceLocation)) {
continue continue
} }
loadBlockModel(resourceLocation, model.compoundCast()!!, data) loadBlockModel(resourceLocation, model.asCompound(), data)
} }
} }
@ -223,14 +223,14 @@ class Registries {
return it return it
} }
var parent: BlockModel? = null var parent: BlockModel? = null
modelData["parent"]?.nullCast<String>()?.let { modelData["parent"].nullCast<String>()?.let {
val parentResourceLocation = ResourceLocation(it) val parentResourceLocation = ResourceLocation(it)
if (parentResourceLocation.path.startsWith("builtin/")) { if (parentResourceLocation.path.startsWith("builtin/")) {
// ToDo // ToDo
return@let return@let
} }
parent = loadBlockModel(parentResourceLocation, fullModelData[parentResourceLocation]?.compoundCast()!!, fullModelData) parent = loadBlockModel(parentResourceLocation, fullModelData[parentResourceLocation]!!.asCompound(), fullModelData)
} }
model = BlockModel(parent, modelData) 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType 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( data class Version(
var versionName: String, var versionName: String,
@ -95,7 +95,7 @@ data class Version(
registries.parentRegistries = Versions.PRE_FLATTENING_MAPPING registries.parentRegistries = Versions.PRE_FLATTENING_MAPPING
} }
val pixlyzerData = try { 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) { } 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... // 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 } Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.VERBOSE) { exception }

View File

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

View File

@ -60,7 +60,7 @@ class WorldRenderer(
val renderWindow: RenderWindow, val renderWindow: RenderWindow,
) : Renderer { ) : Renderer {
private val world: World = connection.world 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 chunkShader: Shader = renderWindow.renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "world"))
private val lightMap = LightMap(connection) 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.listCast
import de.bixilon.minosoft.util.KUtil.nullCast import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.unsafeCast 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 de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.vec3.Vec3 import glm_.vec3.Vec3
@ -27,9 +28,9 @@ open class BlockModel(
val textures: Map<String, String> val textures: Map<String, String>
val elements: List<BlockModelElement> 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 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 uvLock: Boolean = data["uvlock"].nullCast<Boolean>() ?: parent?.uvLock ?: false
val rescale: Boolean = data["rescale"]?.nullCast<Boolean>() ?: parent?.rescale ?: false val rescale: Boolean = data["rescale"].nullCast<Boolean>() ?: parent?.rescale ?: false
val ambientOcclusion: Boolean = data["ambientocclusion"]?.nullCast<Boolean>() ?: parent?.ambientOcclusion ?: true val ambientOcclusion: Boolean = data["ambientocclusion"].nullCast<Boolean>() ?: parent?.ambientOcclusion ?: true
init { init {
textures = data["textures"]?.compoundCast()?.let { textures = data["textures"]?.compoundCast()?.let {
@ -47,7 +48,7 @@ open class BlockModel(
elements = data["elements"]?.listCast()?.let { elements = data["elements"]?.listCast()?.let {
val elements: MutableList<BlockModelElement> = mutableListOf() val elements: MutableList<BlockModelElement> = mutableListOf()
for (element in it) { for (element in it) {
elements += BlockModelElement(element.compoundCast()!!) elements += BlockModelElement(element.asCompound())
} }
elements.toList() elements.toList()
} ?: parent?.elements ?: listOf() } ?: 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.gui.rendering.util.VecUtil.toVec3
import de.bixilon.minosoft.util.KUtil.nullCast import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.unsafeCast 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 de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.func.rad import glm_.func.rad
import glm_.vec3.Vec3 import glm_.vec3.Vec3
@ -29,7 +30,7 @@ open class BlockModelElement(
) { ) {
val from: Vec3 = data["from"]?.toVec3() ?: Vec3.EMPTY val from: Vec3 = data["from"]?.toVec3() ?: Vec3.EMPTY
val to: Vec3 = data["to"]?.toVec3() ?: Vec3(BLOCK_RESOLUTION) 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 faces: MutableMap<Directions, BlockModelFace> = mutableMapOf()
val transformedPositions: Array<Vec3> = arrayOf( val transformedPositions: Array<Vec3> = arrayOf(
Vec3(from.x, from.y, from.z), Vec3(from.x, from.y, from.z),
@ -45,16 +46,16 @@ open class BlockModelElement(
init { init {
data["rotation"]?.compoundCast()?.let { data["rotation"]?.compoundCast()?.let {
val axis = Axes[it["axis"]!!.unsafeCast<String>()] val axis = Axes[it["axis"].unsafeCast<String>()]
val angle = it["angle"]!!.unsafeCast<Double>().toFloat().rad val angle = it["angle"].unsafeCast<Double>().toFloat().rad
val rescale = it["rescale"]?.nullCast<Boolean>() ?: false val rescale = it["rescale"].nullCast<Boolean>() ?: false
rotatePositions(transformedPositions, axis, angle, it["origin"]!!.toVec3(), rescale) rotatePositions(transformedPositions, axis, angle, it["origin"]!!.toVec3(), rescale)
} }
data["faces"]?.compoundCast()?.let { data["faces"]?.compoundCast()?.let {
for ((directionName, json) in it) { for ((directionName, json) in it) {
val direction = Directions[directionName] 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) { constructor(data: Map<String, Any>, from: Vec3, to: Vec3, direction: Directions) {
tint = data.containsKey("tintindex") tint = data.containsKey("tintindex")
textureName = data["texture"]!!.unsafeCast<String>().removePrefix("#") textureName = data["texture"].unsafeCast<String>().removePrefix("#")
cullFace = data["cullface"]?.nullCast<String>()?.let { cullFace = data["cullface"].nullCast<String>()?.let {
if (it == "bottom") { if (it == "bottom") {
Directions.DOWN Directions.DOWN
} else { } else {

View File

@ -58,7 +58,7 @@ class BlockOutlineRenderer(
} }
override fun draw() { override fun draw() {
val raycastHit = renderWindow.inputHandler.camera.target?.nullCast<BlockRaycastHit>() val raycastHit = renderWindow.inputHandler.camera.target.nullCast<BlockRaycastHit>()
var currentMesh = currentMesh 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.listCast
import de.bixilon.minosoft.util.KUtil.toInt import de.bixilon.minosoft.util.KUtil.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast 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 import java.io.InputStream
object FontLoader { object FontLoader {
@ -117,12 +117,12 @@ object FontLoader {
} }
fun loadFontProvider(data: Map<String, Any>, assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): FontProvider { 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" -> { "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" -> { "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" -> { "ttf" -> {
TODO("True Type Fonts are not implemented yet") TODO("True Type Fonts are not implemented yet")
@ -134,8 +134,8 @@ object FontLoader {
fun loadFontProviders(assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): List<FontProvider> { fun loadFontProviders(assetsManager: AssetsManager, textures: MutableMap<ResourceLocation, Texture>): List<FontProvider> {
val ret: MutableList<FontProvider> = mutableListOf() val ret: MutableList<FontProvider> = mutableListOf()
for (providerElement in assetsManager.readJsonAsset(FONT_JSON_RESOURCE_LOCATION).compoundCast()!!["providers"]!!.listCast()!!) { for (providerElement in assetsManager.readJsonAsset(FONT_JSON_RESOURCE_LOCATION).asCompound()["providers"]!!.listCast()!!) {
val provider = loadFontProvider(providerElement.compoundCast()!!, assetsManager, textures) val provider = loadFontProvider(providerElement.asCompound(), assetsManager, textures)
ret.add(provider) ret.add(provider)
} }
return ret 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.RenderConstants
import de.bixilon.minosoft.gui.rendering.textures.Texture import de.bixilon.minosoft.gui.rendering.textures.Texture
import de.bixilon.minosoft.util.KUtil.nullCast 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 de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast
import glm_.vec2.Vec2 import glm_.vec2.Vec2
import glm_.vec2.Vec2i import glm_.vec2.Vec2i
@ -43,21 +44,21 @@ data class HUDAtlasElement(
fun deserialize(json: Map<ResourceLocation, Any>, textures: MutableMap<ResourceLocation, Texture>): Map<ResourceLocation, HUDAtlasElement> { fun deserialize(json: Map<ResourceLocation, Any>, textures: MutableMap<ResourceLocation, Texture>): Map<ResourceLocation, HUDAtlasElement> {
val ret: MutableMap<ResourceLocation, HUDAtlasElement> = mutableMapOf() val ret: MutableMap<ResourceLocation, HUDAtlasElement> = mutableMapOf()
for ((resourceLocation, data) in json) { for ((resourceLocation, data) in json) {
ret[resourceLocation] = deserialize(data.compoundCast()!!, textures) ret[resourceLocation] = deserialize(data.asCompound(), textures)
} }
return ret return ret
} }
fun deserialize(json: Map<String, Any>, textures: MutableMap<ResourceLocation, Texture>): HUDAtlasElement { fun deserialize(json: Map<String, Any>, textures: MutableMap<ResourceLocation, Texture>): HUDAtlasElement {
val keys: MutableSet<Int> = mutableSetOf() val keys: MutableSet<Int> = mutableSetOf()
var textureResourceLocation: ResourceLocation? = json["texture"]?.nullCast<String>()?.let { ResourceLocation(it) } var textureResourceLocation: ResourceLocation? = json["texture"].nullCast<String>()?.let { ResourceLocation(it) }
for (key in json["versions"]!!.compoundCast()!!.keys) { for (key in json["versions"]!!.asCompound().keys) {
keys.add(key.toInt()) keys.add(key.toInt())
} }
// ToDo: Sort and get correct version // 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!!) } val texture = textures.getOrPut(textureResourceLocation!!) { Texture(textureResourceLocation!!) }

View File

@ -238,7 +238,7 @@ class AudioPlayer(
} }
is Map<*, *> -> { is Map<*, *> -> {
sounds += Sound( sounds += Sound(
path = soundJson["name"]!!.unsafeCast<String>().getSoundLocation(), path = soundJson["name"].unsafeCast<String>().getSoundLocation(),
volume = soundJson["volume"]?.unsafeCast<Double>()?.toFloat() ?: 1.0f, volume = soundJson["volume"]?.unsafeCast<Double>()?.toFloat() ?: 1.0f,
pitch = soundJson["pitch"]?.unsafeCast<Double>()?.toFloat() ?: 1.0f, pitch = soundJson["pitch"]?.unsafeCast<Double>()?.toFloat() ?: 1.0f,
weight = soundJson["weight"]?.toInt() ?: 1, weight = soundJson["weight"]?.toInt() ?: 1,
@ -253,7 +253,7 @@ class AudioPlayer(
this.sounds[soundEvent] = SoundList( this.sounds[soundEvent] = SoundList(
soundEvent = soundEvent, soundEvent = soundEvent,
sounds = sounds.toSet(), 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, val count: Int,
) : PlayConnectionEvent(connection, initiator), CancelableEvent { ) : 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType 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 import glm_.vec3.Vec3i
class BlockEntityMetaDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { class BlockEntityMetaDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
@ -31,7 +31,7 @@ class BlockEntityMetaDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
buffer.readBlockPosition() buffer.readBlockPosition()
} }
val type = buffer.connection.registries.blockEntityMetaDataTypeRegistry[buffer.readUnsignedByte()].resourceLocation val type = buffer.connection.registries.blockEntityMetaDataTypeRegistry[buffer.readUnsignedByte()].resourceLocation
val nbt = buffer.readNBT()?.compoundCast()!! val nbt = buffer.readNBT().asCompound()
override fun handle(connection: PlayConnection) { override fun handle(connection: PlayConnection) {
connection.fireEvent(BlockEntityMetaDataChangeEvent(connection, this)) 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.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions 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.toInt
import de.bixilon.minosoft.util.KUtil.unsafeCast
import de.bixilon.minosoft.util.Util import de.bixilon.minosoft.util.Util
import de.bixilon.minosoft.util.chunk.ChunkUtil import de.bixilon.minosoft.util.chunk.ChunkUtil
import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType 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.compoundCast
import glm_.vec2.Vec2i import glm_.vec2.Vec2i
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
@ -107,9 +108,9 @@ class ChunkDataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
if (buffer.versionId >= ProtocolVersions.V_1_9_4) { if (buffer.versionId >= ProtocolVersions.V_1_9_4) {
val blockEntitiesCount = buffer.readVarInt() val blockEntitiesCount = buffer.readVarInt()
for (i in 0 until blockEntitiesCount) { for (i in 0 until blockEntitiesCount) {
val nbt = buffer.readNBT()?.compoundCast()!! val nbt = buffer.readNBT().asCompound()
val position = Vec3i(nbt["x"]?.toInt()!!, nbt["y"]?.toInt()!!, nbt["z"]?.toInt()!!) val position = Vec3i(nbt["x"]!!.toInt(), nbt["y"]!!.toInt(), nbt["z"]!!.toInt())
val resourceLocation = ResourceLocation(nbt["id"]?.nullCast<String>()!!).fix() val resourceLocation = ResourceLocation(nbt["id"].unsafeCast<String>()).fix()
val type = buffer.connection.registries.blockEntityTypeRegistry[resourceLocation] ?: let { val type = buffer.connection.registries.blockEntityTypeRegistry[resourceLocation] ?: let {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.WARN) { "Unknown block entity: $resourceLocation" } Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.WARN) { "Unknown block entity: $resourceLocation" }
null 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
import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_20W27A import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_20W27A
import de.bixilon.minosoft.util.BitByte 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType 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.compoundCast
import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast
import de.bixilon.minosoft.util.task.time.TimeWorker import de.bixilon.minosoft.util.task.time.TimeWorker
@ -97,7 +98,7 @@ class JoinGameS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
if (buffer.versionId < ProtocolVersions.V_20W21A) { if (buffer.versionId < ProtocolVersions.V_20W21A) {
dimension = buffer.connection.registries.dimensionRegistry[buffer.readInt()] dimension = buffer.connection.registries.dimensionRegistry[buffer.readInt()]
} else { } else {
val dimensionCodec = buffer.readNBT()?.compoundCast()!! val dimensionCodec = buffer.readNBT().asCompound()
dimensions = parseDimensionCodec(dimensionCodec, buffer.versionId) dimensions = parseDimensionCodec(dimensionCodec, buffer.versionId)
if (buffer.versionId < ProtocolVersions.V_1_16_2_PRE3) { if (buffer.versionId < ProtocolVersions.V_1_16_2_PRE3) {
dimension = dimensions[buffer.readResourceLocation()]!! dimension = dimensions[buffer.readResourceLocation()]!!
@ -175,12 +176,12 @@ class JoinGameS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
"key" "key"
} else { } else {
"name" "name"
}]?.nullCast<String>()!!) }].unsafeCast<String>())
val dimensionPropertyTag = if (versionId < ProtocolVersions.V_1_16_PRE3 || versionId >= ProtocolVersions.V_1_16_2_PRE1) { val dimensionPropertyTag = if (versionId < ProtocolVersions.V_1_16_PRE3 || versionId >= ProtocolVersions.V_1_16_2_PRE1) {
tag["element"]?.compoundCast()!! tag["element"].asCompound()
} else { } else {
tag.compoundCast() tag.asCompound()
}!! }
dimensionMap[dimensionResourceLocation] = Dimension.deserialize(null, dimensionResourceLocation, dimensionPropertyTag) dimensionMap[dimensionResourceLocation] = Dimension.deserialize(null, dimensionResourceLocation, dimensionPropertyTag)
} }
return dimensionMap 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.Log
import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType 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() { class NBTQueryResponseS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
val transactionId: Int = buffer.readVarInt() val transactionId: Int = buffer.readVarInt()
val nbt: Map<String, Any> = buffer.readNBT()?.compoundCast()!! val nbt: Map<String, Any> = buffer.readNBT().asCompound()
override fun log() { override fun log() {
Log.log(LogMessageType.NETWORK_PACKETS_IN, level = LogLevels.VERBOSE) { "NBT query response (transactionId=$transactionId nbt=$nbt)" } 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 { try {
val dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ") val dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ")
val json = Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "git.json")) val json = Minosoft.MINOSOFT_ASSETS_MANAGER.readJsonAsset(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "git.json"))
GIT_BRANCH = json["git.branch"]!!.unsafeCast() GIT_BRANCH = json["git.branch"].unsafeCast()
GIT_BUILD_HOST_BRANCH = json["git.build.host"]!!.unsafeCast() GIT_BUILD_HOST_BRANCH = json["git.build.host"].unsafeCast()
GIT_BUILD_TIME = dateFormat.parse(json["git.build.time"]!!.unsafeCast()).time GIT_BUILD_TIME = dateFormat.parse(json["git.build.time"].unsafeCast()).time
GIT_BUILD_USER_EMAIL = json["git.build.user.email"]!!.unsafeCast() GIT_BUILD_USER_EMAIL = json["git.build.user.email"].unsafeCast()
GIT_BUILD_USER_NAME = json["git.build.user.name"]!!.unsafeCast() GIT_BUILD_USER_NAME = json["git.build.user.name"].unsafeCast()
GIT_BUILD_VERSION = json["git.build.version"]!!.unsafeCast() GIT_BUILD_VERSION = json["git.build.version"].unsafeCast()
GIT_CLOSEST_TAG_COMMIT_COUNT = json["git.closest.tag.commit.count"]!!.unsafeCast() GIT_CLOSEST_TAG_COMMIT_COUNT = json["git.closest.tag.commit.count"].unsafeCast()
GIT_CLOSEST_TAG_NAME = json["git.closest.tag.name"]!!.unsafeCast() GIT_CLOSEST_TAG_NAME = json["git.closest.tag.name"].unsafeCast()
GIT_COMMIT_ID = json["git.commit.id"]!!.unsafeCast() GIT_COMMIT_ID = json["git.commit.id"].unsafeCast()
GIT_COMMIT_ID_ABBREV = json["git.commit.id.abbrev"]!!.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 = json["git.commit.id.describe"].unsafeCast()
GIT_COMMIT_ID_DESCRIBE_SHORT = json["git.commit.id.describe-short"]!!.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_FULL = json["git.commit.message.full"].unsafeCast()
GIT_COMMIT_MESSAGE_SHORT = json["git.commit.message.short"]!!.unsafeCast() GIT_COMMIT_MESSAGE_SHORT = json["git.commit.message.short"].unsafeCast()
GIT_COMMIT_TIME = dateFormat.parse(json["git.commit.time"]!!.unsafeCast()).time GIT_COMMIT_TIME = dateFormat.parse(json["git.commit.time"].unsafeCast()).time
GIT_COMMIT_USER_EMAIL = json["git.commit.user.email"]!!.unsafeCast() GIT_COMMIT_USER_EMAIL = json["git.commit.user.email"].unsafeCast()
GIT_COMMIT_USER_NAME = json["git.commit.user.name"]!!.unsafeCast() GIT_COMMIT_USER_NAME = json["git.commit.user.name"].unsafeCast()
GIT_DIRTY = json["git.dirty"]!!.booleanCast() GIT_DIRTY = json["git.dirty"]!!.booleanCast()
GIT_LOCAL_BRANCH_AHEAD = json["git.local.branch.ahead"]!!.unsafeCast() GIT_LOCAL_BRANCH_AHEAD = json["git.local.branch.ahead"].unsafeCast()
GIT_LOCAL_BRANCH_BEHIND = json["git.local.branch.behind"]!!.unsafeCast() GIT_LOCAL_BRANCH_BEHIND = json["git.local.branch.behind"].unsafeCast()
GIT_TAGS = if (json["git.tags"]!!.unsafeCast<String>().isBlank()) { GIT_TAGS = if (json["git.tags"].unsafeCast<String>().isBlank()) {
0 0
} else { } 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 IS_INITIALIZED = true
} catch (exception: Throwable) { } catch (exception: Throwable) {

View File

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

View File

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

View File

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