From fe63a7f7ab29b26c92c03091eb75517289f6e904 Mon Sep 17 00:00:00 2001 From: David Choo Date: Tue, 29 Dec 2020 18:09:42 -0500 Subject: [PATCH 1/2] Fix pick block (#1753) * Use pick_item mappings * Update mappings * Update mappings and fix wording --- .../BedrockBlockPickRequestTranslator.java | 3 +-- .../BedrockEntityPickRequestTranslator.java | 2 +- .../world/block/BlockTranslator.java | 22 +++++++++++++++++++ .../connector/utils/InventoryUtils.java | 7 +++++- connector/src/main/resources/mappings | 2 +- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestTranslator.java index 3e40ddd6f..f7e3fbd9c 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockBlockPickRequestTranslator.java @@ -46,7 +46,6 @@ public class BedrockBlockPickRequestTranslator extends PacketTranslator JAVA_RUNTIME_ID_TO_PICK_ITEM = new Int2ObjectOpenHashMap<>(); + /** * Java numeric ID to java unique identifier, used for block names in the statistics screen */ @@ -174,6 +176,11 @@ public class BlockTranslator { JAVA_RUNTIME_ID_TO_COLLISION_INDEX.put(javaRuntimeId, collisionIndexNode.intValue()); } + JsonNode pickItemNode = entry.getValue().get("pick_item"); + if (pickItemNode != null) { + JAVA_RUNTIME_ID_TO_PICK_ITEM.put(javaRuntimeId, pickItemNode.textValue()); + } + JAVA_ID_BLOCK_MAP.put(javaId, javaRuntimeId); BlockStateValues.storeBlockStateValues(entry, javaRuntimeId); @@ -362,4 +369,19 @@ public class BlockTranslator { public static int getJavaWaterloggedState(int bedrockId) { return BEDROCK_TO_JAVA_BLOCK_MAP.get(1 << 31 | bedrockId); } + + /** + * Get the item a Java client would receive when pressing + * the Pick Block key on a specific Java block state. + * + * @param javaId The Java runtime id of the block + * @return The Java identifier of the item + */ + public static String getPickItem(int javaId) { + String itemIdentifier = JAVA_RUNTIME_ID_TO_PICK_ITEM.get(javaId); + if (itemIdentifier == null) { + return JAVA_ID_BLOCK_MAP.inverse().get(javaId).split("\\[")[0]; + } + return itemIdentifier; + } } diff --git a/connector/src/main/java/org/geysermc/connector/utils/InventoryUtils.java b/connector/src/main/java/org/geysermc/connector/utils/InventoryUtils.java index e9d7f13a6..75bd7c94e 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/InventoryUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/InventoryUtils.java @@ -46,6 +46,7 @@ import org.geysermc.connector.network.translators.inventory.InventoryTranslator; import org.geysermc.connector.network.translators.item.ItemEntry; import org.geysermc.connector.network.translators.item.ItemRegistry; import org.geysermc.connector.network.translators.item.ItemTranslator; +import org.geysermc.connector.network.translators.world.block.BlockTranslator; import java.util.Collections; import java.util.Objects; @@ -168,13 +169,17 @@ public class InventoryUtils { * @param session the Bedrock client's session * @param itemName the Java identifier of the item to search/select */ - public static void findOrCreatePickedBlock(GeyserSession session, String itemName) { + public static void findOrCreateItem(GeyserSession session, String itemName) { // Get the inventory to choose a slot to pick Inventory inventory = session.getInventoryCache().getOpenInventory(); if (inventory == null) { inventory = session.getInventory(); } + if (itemName.equals("minecraft:air")) { + return; + } + // Check hotbar for item for (int i = 36; i < 45; i++) { if (inventory.getItem(i) == null) { diff --git a/connector/src/main/resources/mappings b/connector/src/main/resources/mappings index 3f4707c0d..143285afb 160000 --- a/connector/src/main/resources/mappings +++ b/connector/src/main/resources/mappings @@ -1 +1 @@ -Subproject commit 3f4707c0d26427dfe2ac79eca68e6048732f4412 +Subproject commit 143285afb4bdf4d5ef40ef7a7959477dabf4d34c From e3b94bc8594d3db1bbdba3bd20a6faa37ca1c512 Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Tue, 29 Dec 2020 14:58:02 -0900 Subject: [PATCH 2/2] Thrown potion entity color (#1756) * Fix thrown potion color * Prevent area effect cloud from appearing to catch on fire * Don't set ENCHANTED flag on all potions --- .../entity/AreaEffectCloudEntity.java | 3 + .../connector/entity/ThrownPotionEntity.java | 77 +++++++++++++++++++ .../connector/entity/type/EntityType.java | 2 +- 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 connector/src/main/java/org/geysermc/connector/entity/ThrownPotionEntity.java diff --git a/connector/src/main/java/org/geysermc/connector/entity/AreaEffectCloudEntity.java b/connector/src/main/java/org/geysermc/connector/entity/AreaEffectCloudEntity.java index 308d2121a..bffba186e 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/AreaEffectCloudEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/AreaEffectCloudEntity.java @@ -29,6 +29,7 @@ import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadat import com.github.steveice10.mc.protocol.data.game.world.particle.Particle; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; +import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.effect.EffectRegistry; @@ -45,6 +46,8 @@ public class AreaEffectCloudEntity extends Entity { metadata.put(EntityData.AREA_EFFECT_CLOUD_RADIUS, 0.0f); metadata.put(EntityData.AREA_EFFECT_CLOUD_CHANGE_RATE, -0.005f); metadata.put(EntityData.AREA_EFFECT_CLOUD_CHANGE_ON_PICKUP, -0.5f); + + metadata.getFlags().setFlag(EntityFlag.FIRE_IMMUNE, true); } @Override diff --git a/connector/src/main/java/org/geysermc/connector/entity/ThrownPotionEntity.java b/connector/src/main/java/org/geysermc/connector/entity/ThrownPotionEntity.java new file mode 100644 index 000000000..e9ea5fd7f --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/entity/ThrownPotionEntity.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.entity; + +import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.MetadataType; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.github.steveice10.opennbt.tag.builtin.Tag; +import com.nukkitx.math.vector.Vector3f; +import com.nukkitx.protocol.bedrock.data.entity.EntityData; +import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; +import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.entity.type.EntityType; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.translators.item.ItemEntry; +import org.geysermc.connector.network.translators.item.ItemRegistry; +import org.geysermc.connector.network.translators.item.Potion; + +import java.util.EnumSet; + +public class ThrownPotionEntity extends ThrowableEntity { + private static final EnumSet NON_ENCHANTED_POTIONS = EnumSet.of(Potion.WATER, Potion.MUNDANE, Potion.THICK, Potion.AWKWARD); + + public ThrownPotionEntity(long entityId, long geyserId, EntityType entityType, Vector3f position, Vector3f motion, Vector3f rotation) { + super(entityId, geyserId, entityType, position, motion, rotation); + } + + @Override + public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession session) { + if (entityMetadata.getId() == 7 && entityMetadata.getType() == MetadataType.ITEM) { + ItemStack itemStack = (ItemStack) entityMetadata.getValue(); + ItemEntry itemEntry = ItemRegistry.getItem(itemStack); + if (itemEntry.getJavaIdentifier().endsWith("potion") && itemStack.getNbt() != null) { + Tag potionTag = itemStack.getNbt().get("Potion"); + if (potionTag instanceof StringTag) { + Potion potion = Potion.getByJavaIdentifier(((StringTag) potionTag).getValue()); + if (potion != null) { + metadata.put(EntityData.POTION_AUX_VALUE, potion.getBedrockId()); + metadata.getFlags().setFlag(EntityFlag.ENCHANTED, !NON_ENCHANTED_POTIONS.contains(potion)); + } else { + metadata.put(EntityData.POTION_AUX_VALUE, 0); + GeyserConnector.getInstance().getLogger().debug("Unknown java potion: " + potionTag.getValue()); + } + } + + boolean isLingering = itemEntry.getJavaIdentifier().equals("minecraft:lingering_potion"); + metadata.getFlags().setFlag(EntityFlag.LINGERING, isLingering); + } + } + + super.updateBedrockMetadata(entityMetadata, session); + } +} diff --git a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java index 3e6b6c72d..79a69d648 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java +++ b/connector/src/main/java/org/geysermc/connector/entity/type/EntityType.java @@ -123,7 +123,7 @@ public enum EntityType { PAINTING(PaintingEntity.class, 83, 0f), MINECART(MinecartEntity.class, 84, 0.7f, 0.98f, 0.98f, 0.35f), FIREBALL(ItemedFireballEntity.class, 85, 1.0f), - THROWN_POTION(ThrowableEntity.class, 86, 0.25f, 0.25f, 0.25f, 0f, "minecraft:splash_potion"), + THROWN_POTION(ThrownPotionEntity.class, 86, 0.25f, 0.25f, 0.25f, 0f, "minecraft:splash_potion"), THROWN_ENDERPEARL(ThrowableEntity.class, 87, 0.25f, 0.25f, 0.25f, 0f, "minecraft:ender_pearl"), LEASH_KNOT(LeashKnotEntity.class, 88, 0.5f, 0.375f), WITHER_SKULL(WitherSkullEntity.class, 89, 0.3125f),