From 4e918d7c6fd8674c2e38cf92a86f2ee4b94f7d3c Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 29 Mar 2021 20:14:25 +0200 Subject: [PATCH] data: wip: Improve item storing --- .../entities/entities/animal/horse/Horse.kt | 2 +- .../entities/player/PlayerEntity.java | 4 +-- .../data/inventory/InventorySlots.java | 13 ++++++- .../bixilon/minosoft/data/inventory/Slot.java | 2 +- .../minosoft/data/mappings/blocks/Block.kt | 2 +- .../data/mappings/{ => items}/Item.kt | 35 ++++++++++--------- .../data/mappings/items/ItemRegistry.kt | 1 - .../data/mappings/items/armor/ArmorItem.kt | 26 ++++++++++++++ .../data/mappings/versions/VersionMapping.kt | 1 + .../clientbound/play/PacketSpawnPlayer.java | 2 +- 10 files changed, 64 insertions(+), 24 deletions(-) rename src/main/java/de/bixilon/minosoft/data/mappings/{ => items}/Item.kt (51%) create mode 100644 src/main/java/de/bixilon/minosoft/data/mappings/items/armor/ArmorItem.kt diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/animal/horse/Horse.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/animal/horse/Horse.kt index 5111b2d1c..4470710ff 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/animal/horse/Horse.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/animal/horse/Horse.kt @@ -15,8 +15,8 @@ package de.bixilon.minosoft.data.entities.entities.animal.horse import de.bixilon.minosoft.data.entities.EntityMetaDataFields import de.bixilon.minosoft.data.entities.EntityRotation import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction -import de.bixilon.minosoft.data.mappings.Item import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.mappings.items.Item import de.bixilon.minosoft.protocol.network.Connection import de.bixilon.minosoft.protocol.protocol.ProtocolVersions import glm_.vec3.Vec3 diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.java b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.java index 4f6648a6b..24b8a4458 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/player/PlayerEntity.java @@ -19,7 +19,7 @@ import de.bixilon.minosoft.data.entities.EntityMetaDataFields; import de.bixilon.minosoft.data.entities.EntityRotation; import de.bixilon.minosoft.data.entities.entities.EntityMetaDataFunction; import de.bixilon.minosoft.data.entities.entities.LivingEntity; -import de.bixilon.minosoft.data.mappings.Item; +import de.bixilon.minosoft.data.mappings.items.Item; import de.bixilon.minosoft.data.player.Hands; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.util.nbt.tag.CompoundTag; @@ -98,7 +98,7 @@ public class PlayerEntity extends LivingEntity { } public Gamemodes getGamemode() { - return gamemode; + return this.gamemode; } public void setGamemode(Gamemodes gamemode) { diff --git a/src/main/java/de/bixilon/minosoft/data/inventory/InventorySlots.java b/src/main/java/de/bixilon/minosoft/data/inventory/InventorySlots.java index ab8edfa0f..2d0e42775 100644 --- a/src/main/java/de/bixilon/minosoft/data/inventory/InventorySlots.java +++ b/src/main/java/de/bixilon/minosoft/data/inventory/InventorySlots.java @@ -122,10 +122,21 @@ public class InventorySlots { } return value; } + + public static EntityInventorySlots get(String name) { + return switch (name) { + case "mainhand" -> MAIN_HAND; + case "offhand" -> OFF_HAND; + case "feet" -> BOOTS; + case "legs" -> LEGGINGS; + case "chest" -> CHESTPLATE; + case "head" -> HELMET; + default -> throw new IllegalArgumentException("Invalid equipment slot " + name); + }; + } } public interface InventoryInterface { int getId(int versionId); } - } diff --git a/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java b/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java index 45b6750a9..4ba39daee 100644 --- a/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java +++ b/src/main/java/de/bixilon/minosoft/data/inventory/Slot.java @@ -14,8 +14,8 @@ package de.bixilon.minosoft.data.inventory; import de.bixilon.minosoft.data.mappings.Enchantment; -import de.bixilon.minosoft.data.mappings.Item; import de.bixilon.minosoft.data.mappings.ResourceLocation; +import de.bixilon.minosoft.data.mappings.items.Item; import de.bixilon.minosoft.data.mappings.versions.Version; import de.bixilon.minosoft.data.mappings.versions.VersionMapping; import de.bixilon.minosoft.data.text.ChatComponent; diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Block.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Block.kt index 17c06904e..59c777d56 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Block.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Block.kt @@ -13,10 +13,10 @@ package de.bixilon.minosoft.data.mappings.blocks import com.google.gson.JsonObject -import de.bixilon.minosoft.data.mappings.Item import de.bixilon.minosoft.data.mappings.RegistryItem import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.ResourceLocationDeserializer +import de.bixilon.minosoft.data.mappings.items.Item import de.bixilon.minosoft.data.mappings.versions.VersionMapping import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.TintColorCalculator diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/Item.kt b/src/main/java/de/bixilon/minosoft/data/mappings/items/Item.kt similarity index 51% rename from src/main/java/de/bixilon/minosoft/data/mappings/Item.kt rename to src/main/java/de/bixilon/minosoft/data/mappings/items/Item.kt index bcd7de3a9..6e470ff76 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/Item.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/items/Item.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020 Moritz Zwerger + * 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. * @@ -10,31 +10,34 @@ * * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.mappings +package de.bixilon.minosoft.data.mappings.items import com.google.gson.JsonObject import de.bixilon.minosoft.data.Rarities +import de.bixilon.minosoft.data.mappings.RegistryItem +import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.mappings.ResourceLocationDeserializer +import de.bixilon.minosoft.data.mappings.items.armor.ArmorItem import de.bixilon.minosoft.data.mappings.versions.VersionMapping -data class Item( +open class Item( override val resourceLocation: ResourceLocation, - val rarity: Rarities = Rarities.COMMON, - val maxStackSize: Int = 64, - val maxDamage: Int = 0, - val isFireResistant: Boolean = false, - val descriptionId: String?, + data: JsonObject, ) : RegistryItem { + val rarity: Rarities = data["rarity"]?.asInt?.let { Rarities.VALUES[it] } ?: Rarities.COMMON + val maxStackSize: Int = data["max_stack_size"]?.asInt ?: 64 + val maxDamage: Int = data["max_damage"]?.asInt ?: 64 + val isFireResistant: Boolean = data["is_fire_resistant"]?.asBoolean ?: false + val translationKey: String? = data["description_id"]?.asString companion object : ResourceLocationDeserializer { override fun deserialize(mappings: VersionMapping, resourceLocation: ResourceLocation, data: JsonObject): Item { - return Item( - resourceLocation = resourceLocation, - rarity = data["rarity"]?.asInt?.let { Rarities.VALUES[it] } ?: Rarities.COMMON, - maxStackSize = data["max_stack_size"]?.asInt ?: 64, - maxDamage = data["max_damage"]?.asInt ?: 0, - isFireResistant = data["is_fire_resistant"]?.asBoolean ?: false, - descriptionId = data["description_id"]?.asString, - ) + return when (data["class"].asString) { + "ArmorItem" -> ArmorItem(resourceLocation, data) + // "Item" -> Item(resourceLocation, data) + // else -> TODO("Can not find item class: ${data["class"].asString}") + else -> Item(resourceLocation, data) + } } } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/items/ItemRegistry.kt b/src/main/java/de/bixilon/minosoft/data/mappings/items/ItemRegistry.kt index c5622c02d..55d9b0385 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/items/ItemRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/items/ItemRegistry.kt @@ -14,7 +14,6 @@ package de.bixilon.minosoft.data.mappings.items import com.google.gson.JsonObject -import de.bixilon.minosoft.data.mappings.Item import de.bixilon.minosoft.data.mappings.Registry import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.ResourceLocationDeserializer diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/items/armor/ArmorItem.kt b/src/main/java/de/bixilon/minosoft/data/mappings/items/armor/ArmorItem.kt new file mode 100644 index 000000000..aa330b203 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/mappings/items/armor/ArmorItem.kt @@ -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 . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.data.mappings.items.armor + +import com.google.gson.JsonObject +import de.bixilon.minosoft.data.inventory.InventorySlots +import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.mappings.items.Item + +open class ArmorItem(resourceLocation: ResourceLocation, data: JsonObject) : Item(resourceLocation, data) { + val protection = data["defense"].asFloat + val toughness = data["toughness"].asFloat + val equipmentSlot = data["equipment_slot"].asString.let { InventorySlots.EntityInventorySlots.get(it) } + val knockbackResistance = data["knockback_resistance"]?.asFloat ?: 0.0f +} diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt index 30c9da920..a1b83e9da 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt @@ -25,6 +25,7 @@ import de.bixilon.minosoft.data.mappings.biomes.BiomeCategory import de.bixilon.minosoft.data.mappings.biomes.BiomePrecipitation import de.bixilon.minosoft.data.mappings.blocks.Block import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.data.mappings.items.Item import de.bixilon.minosoft.data.mappings.items.ItemRegistry import de.bixilon.minosoft.data.mappings.materials.Material import de.bixilon.minosoft.data.mappings.particle.Particle diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java index d440caa76..3ff0f1c60 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java @@ -18,7 +18,7 @@ import de.bixilon.minosoft.data.entities.EntityMetaData; import de.bixilon.minosoft.data.entities.EntityRotation; import de.bixilon.minosoft.data.entities.Velocity; import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity; -import de.bixilon.minosoft.data.mappings.Item; +import de.bixilon.minosoft.data.mappings.items.Item; import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket;