mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 03:44:54 -04:00
improve nbt/json/mbf casting
This commit is contained in:
parent
d89685fe15
commit
04aea97d05
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
}
|
||||
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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())))))
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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())
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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(),
|
||||
)
|
||||
|
@ -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>()],
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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(),
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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(),
|
||||
)
|
||||
|
@ -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"
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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 }
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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!!) }
|
||||
|
@ -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) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)" }
|
||||
|
@ -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) {
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user