mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 09:56:37 -04:00
pixlyzer/entities: load default entity attributes
This commit is contained in:
parent
c7b8aa4094
commit
11a3b096d6
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.data.entities.attributes
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.util.KUtil.asResourceLocation
|
||||||
|
|
||||||
|
object DefaultEntityAttributes {
|
||||||
|
// ToDo
|
||||||
|
|
||||||
|
val GENERIC_MAX_HEALTH = "minecraft:generic.max_health".asResourceLocation()
|
||||||
|
val GENERIC_FOLLOW_RANGE = "minecraft:generic.follow_range".asResourceLocation()
|
||||||
|
val GENERIC_KNOCKBACK_RESISTANCE = "minecraft:generic.knockback_resistance".asResourceLocation()
|
||||||
|
val GENERIC_MOVEMENT_SPEED = "minecraft:generic.movement_speed".asResourceLocation()
|
||||||
|
val GENERIC_ATTACK_KNOCKBACK = "minecraft:generic.attack_knockback".asResourceLocation()
|
||||||
|
val GENERIC_ARMOR = "minecraft:generic.armor".asResourceLocation()
|
||||||
|
val GENERIC_ARMOR_TOUGHNESS = "minecraft:generic.armor_toughness".asResourceLocation()
|
||||||
|
}
|
@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.entities.entities
|
|||||||
|
|
||||||
import de.bixilon.minosoft.data.entities.EntityMetaDataFields
|
import de.bixilon.minosoft.data.entities.EntityMetaDataFields
|
||||||
import de.bixilon.minosoft.data.entities.EntityRotation
|
import de.bixilon.minosoft.data.entities.EntityRotation
|
||||||
|
import de.bixilon.minosoft.data.entities.attributes.DefaultEntityAttributes
|
||||||
import de.bixilon.minosoft.data.mappings.entities.EntityType
|
import de.bixilon.minosoft.data.mappings.entities.EntityType
|
||||||
import de.bixilon.minosoft.data.player.Hands
|
import de.bixilon.minosoft.data.player.Hands
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
@ -44,7 +45,7 @@ abstract class LivingEntity(connection: PlayConnection, entityType: EntityType,
|
|||||||
get() {
|
get() {
|
||||||
val meta = entityMetaData.sets.getFloat(EntityMetaDataFields.LIVING_ENTITY_HEALTH)
|
val meta = entityMetaData.sets.getFloat(EntityMetaDataFields.LIVING_ENTITY_HEALTH)
|
||||||
return if (meta == Float.MIN_VALUE) {
|
return if (meta == Float.MIN_VALUE) {
|
||||||
entityType.maxHealth
|
entityType.attributes[DefaultEntityAttributes.GENERIC_MAX_HEALTH] ?: 1.0f
|
||||||
} else {
|
} else {
|
||||||
meta
|
meta
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ import de.bixilon.minosoft.data.mappings.registry.RegistryItem
|
|||||||
import de.bixilon.minosoft.data.mappings.registry.ResourceLocationDeserializer
|
import de.bixilon.minosoft.data.mappings.registry.ResourceLocationDeserializer
|
||||||
import de.bixilon.minosoft.data.mappings.registry.Translatable
|
import de.bixilon.minosoft.data.mappings.registry.Translatable
|
||||||
import de.bixilon.minosoft.data.mappings.versions.VersionMapping
|
import de.bixilon.minosoft.data.mappings.versions.VersionMapping
|
||||||
|
import de.bixilon.minosoft.datafixer.EntityAttributeFixer.fix
|
||||||
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
|
||||||
import glm_.vec3.Vec3
|
import glm_.vec3.Vec3
|
||||||
|
|
||||||
@ -34,7 +35,7 @@ data class EntityType(
|
|||||||
val height: Float,
|
val height: Float,
|
||||||
val sizeFixed: Boolean,
|
val sizeFixed: Boolean,
|
||||||
val fireImmune: Boolean,
|
val fireImmune: Boolean,
|
||||||
val maxHealth: Float,
|
val attributes: Map<ResourceLocation, Float>,
|
||||||
val factory: EntityFactory<out Entity>,
|
val factory: EntityFactory<out Entity>,
|
||||||
) : RegistryItem, Translatable {
|
) : RegistryItem, Translatable {
|
||||||
|
|
||||||
@ -57,6 +58,14 @@ data class EntityType(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val attributes: MutableMap<ResourceLocation, Float> = mutableMapOf()
|
||||||
|
|
||||||
|
data["attributes"]?.asJsonObject?.let {
|
||||||
|
for ((attributeResourceLocation, value) in it.entrySet()) {
|
||||||
|
attributes[ResourceLocation.getPathResourceLocation(attributeResourceLocation).fix()] = value.asFloat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return EntityType(
|
return EntityType(
|
||||||
resourceLocation = resourceLocation,
|
resourceLocation = resourceLocation,
|
||||||
translationKey = data["translation_key"]?.asString,
|
translationKey = data["translation_key"]?.asString,
|
||||||
@ -64,7 +73,7 @@ data class EntityType(
|
|||||||
height = data["height"].asFloat,
|
height = data["height"].asFloat,
|
||||||
fireImmune = data["fire_immune"]?.asBoolean ?: false,
|
fireImmune = data["fire_immune"]?.asBoolean ?: false,
|
||||||
sizeFixed = data["size_fixed"]?.asBoolean ?: false,
|
sizeFixed = data["size_fixed"]?.asBoolean ?: false,
|
||||||
maxHealth = data["minecraft:generic.max_health"]?.asFloat ?: Float.MAX_VALUE,
|
attributes = attributes.toMap(),
|
||||||
factory = DefaultEntityFactories.getEntityFactory(resourceLocation) ?: error("Can not find entity factory for $resourceLocation"),
|
factory = DefaultEntityFactories.getEntityFactory(resourceLocation) ?: error("Can not find entity factory for $resourceLocation"),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
26
src/main/java/de/bixilon/minosoft/datafixer/DataFixerUtil.kt
Normal file
26
src/main/java/de/bixilon/minosoft/datafixer/DataFixerUtil.kt
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.datafixer
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
|
|
||||||
|
object DataFixerUtil {
|
||||||
|
fun Map<String, String>.asResourceLocationMap(): Map<ResourceLocation, ResourceLocation> {
|
||||||
|
val out: MutableMap<ResourceLocation, ResourceLocation> = mutableMapOf()
|
||||||
|
for ((key, value) in this) {
|
||||||
|
out[ResourceLocation.getResourceLocation(key)] = ResourceLocation.getResourceLocation(value)
|
||||||
|
}
|
||||||
|
return out.toMap()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Minosoft
|
||||||
|
* Copyright (C) 2021 Moritz Zwerger
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.datafixer
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
|
import de.bixilon.minosoft.datafixer.DataFixerUtil.asResourceLocationMap
|
||||||
|
|
||||||
|
object EntityAttributeFixer {
|
||||||
|
private val RENAMES: Map<ResourceLocation, ResourceLocation> = mapOf(
|
||||||
|
"generic.maxHealth" to "generic.max_health",
|
||||||
|
"zombie.spawnReinforcements" to "zombie.spawn_reinforcements",
|
||||||
|
|
||||||
|
"horse.jumpStrength" to "horse.jump_strength",
|
||||||
|
|
||||||
|
"generic.followRange" to "generic.follow_range",
|
||||||
|
|
||||||
|
"generic.knockbackResistance" to "generic.knockback_resistance",
|
||||||
|
|
||||||
|
"generic.movementSpeed" to "generic.movement_speed",
|
||||||
|
|
||||||
|
"generic.flyingSpeed" to "generic.flying_speed",
|
||||||
|
|
||||||
|
"generic.attackDamage" to "generic.attack_damage",
|
||||||
|
"generic.attackKnockback" to "generic.attack_knockback",
|
||||||
|
"generic.attackSpeed" to "generic.attack_speed",
|
||||||
|
"generic.armorToughness" to "generic.armor_toughness",
|
||||||
|
).asResourceLocationMap()
|
||||||
|
|
||||||
|
|
||||||
|
fun ResourceLocation.fix(): ResourceLocation {
|
||||||
|
return RENAMES.getOrDefault(this, this)
|
||||||
|
}
|
||||||
|
}
|
@ -31,7 +31,7 @@ class PlayerAbilitiesS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
|
|||||||
init {
|
init {
|
||||||
val flags = buffer.readUnsignedByte()
|
val flags = buffer.readUnsignedByte()
|
||||||
if (buffer.versionId < ProtocolVersions.V_14W03B) { // ToDo: Find out correct version
|
if (buffer.versionId < ProtocolVersions.V_14W03B) { // ToDo: Find out correct version
|
||||||
isInvulnerable = flags isBit (0)
|
isInvulnerable = flags.isBit(0)
|
||||||
isFlying = flags.isBit(1)
|
isFlying = flags.isBit(1)
|
||||||
canFly = flags.isBit(2)
|
canFly = flags.isBit(2)
|
||||||
canInstantBuild = flags.isBit(3)
|
canInstantBuild = flags.isBit(3)
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.util
|
package de.bixilon.minosoft.util
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.mappings.ResourceLocation
|
||||||
import de.bixilon.minosoft.util.enum.AliasableEnum
|
import de.bixilon.minosoft.util.enum.AliasableEnum
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@ -48,4 +49,8 @@ object KUtil {
|
|||||||
}
|
}
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun String.asResourceLocation(): ResourceLocation {
|
||||||
|
return ResourceLocation(this)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user