diff --git a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java index 833f2f46d..10e93810e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java +++ b/core/src/main/java/org/geysermc/geyser/entity/attribute/GeyserAttributeType.java @@ -35,22 +35,22 @@ import lombok.Getter; public enum GeyserAttributeType { // Universal Attributes - FOLLOW_RANGE("minecraft:generic.follow_range", "minecraft:follow_range", 0f, 2048f, 32f), - KNOCKBACK_RESISTANCE("minecraft:generic.knockback_resistance", "minecraft:knockback_resistance", 0f, 1f, 0f), - MOVEMENT_SPEED("minecraft:generic.movement_speed", "minecraft:movement", 0f, 1024f, 0.1f), - FLYING_SPEED("minecraft:generic.flying_speed", "minecraft:movement", 0.0f, 1024.0f, 0.4000000059604645f), - ATTACK_DAMAGE("minecraft:generic.attack_damage", "minecraft:attack_damage", 0f, 2048f, 1f), - HORSE_JUMP_STRENGTH("minecraft:horse.jump_strength", "minecraft:horse.jump_strength", 0.0f, 2.0f, 0.7f), - LUCK("minecraft:generic.luck", "minecraft:luck", -1024f, 1024f, 0f), + FOLLOW_RANGE("minecraft:follow_range", "minecraft:follow_range", 0f, 2048f, 32f), + KNOCKBACK_RESISTANCE("minecraft:knockback_resistance", "minecraft:knockback_resistance", 0f, 1f, 0f), + MOVEMENT_SPEED("minecraft:movement_speed", "minecraft:movement", 0f, 1024f, 0.1f), + FLYING_SPEED("minecraft:flying_speed", "minecraft:movement", 0.0f, 1024.0f, 0.4000000059604645f), + ATTACK_DAMAGE("minecraft:attack_damage", "minecraft:attack_damage", 0f, 2048f, 1f), + HORSE_JUMP_STRENGTH("minecraft:jump_strength", "minecraft:horse.jump_strength", 0.0f, 2.0f, 0.7f), + LUCK("minecraft:luck", "minecraft:luck", -1024f, 1024f, 0f), // Java Attributes - ARMOR("minecraft:generic.armor", null, 0f, 30f, 0f), - ARMOR_TOUGHNESS("minecraft:generic.armor_toughness", null, 0F, 20f, 0f), - ATTACK_KNOCKBACK("minecraft:generic.attack_knockback", null, 1.5f, Float.MAX_VALUE, 0f), - ATTACK_SPEED("minecraft:generic.attack_speed", null, 0f, 1024f, 4f), - MAX_HEALTH("minecraft:generic.max_health", null, 0f, 1024f, 20f), - SCALE("minecraft:generic.scale", null, 0.0625f, 16f, 1f), - BLOCK_INTERACTION_RANGE("minecraft:player.block_interaction_range", null, 0.0f, 64f, 4.5f), + ARMOR("minecraft:armor", null, 0f, 30f, 0f), + ARMOR_TOUGHNESS("minecraft:armor_toughness", null, 0F, 20f, 0f), + ATTACK_KNOCKBACK("minecraft:attack_knockback", null, 1.5f, Float.MAX_VALUE, 0f), + ATTACK_SPEED("minecraft:attack_speed", null, 0f, 1024f, 4f), + MAX_HEALTH("minecraft:max_health", null, 0f, 1024f, 20f), + SCALE("minecraft:scale", null, 0.0625f, 16f, 1f), + BLOCK_INTERACTION_RANGE("minecraft:block_interaction_range", null, 0.0f, 64f, 4.5f), MINING_EFFICIENCY("minecraft:mining_efficiency", null, 0f, 1024f, 0f), BLOCK_BREAK_SPEED("minecraft:block_break_speed", null, 0f, 1024f, 1f), SUBMERGED_MINING_SPEED("minecraft:submerged_mining_speed", null, 0f, 20f, 0.2f), diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java index 04df96361..7d789fb2a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java @@ -32,8 +32,6 @@ import org.cloudburstmc.protocol.bedrock.packet.AnimatePacket; import org.cloudburstmc.protocol.bedrock.packet.MoveEntityAbsolutePacket; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinitions; -import org.geysermc.geyser.item.Items; -import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; @@ -220,10 +218,6 @@ public class BoatEntity extends Entity implements Leashable, Tickable { return leashHolderBedrockId; } - public Item getPickItem() { - return variant.pickItem; - } - private void sendAnimationPacket(GeyserSession session, Entity rower, AnimatePacket.Action action, float rowTime) { AnimatePacket packet = new AnimatePacket(); packet.setRuntimeEntityId(rower.getGeyserId()); @@ -236,23 +230,17 @@ public class BoatEntity extends Entity implements Leashable, Tickable { * Ordered by Bedrock ordinal */ public enum BoatVariant { - OAK(Items.OAK_BOAT, Items.OAK_CHEST_BOAT), - SPRUCE(Items.SPRUCE_BOAT, Items.SPRUCE_CHEST_BOAT), - BIRCH(Items.BIRCH_BOAT, Items.BIRCH_CHEST_BOAT), - JUNGLE(Items.JUNGLE_BOAT, Items.JUNGLE_CHEST_BOAT), - ACACIA(Items.ACACIA_BOAT, Items.ACACIA_CHEST_BOAT), - DARK_OAK(Items.DARK_OAK_BOAT, Items.DARK_OAK_CHEST_BOAT), - MANGROVE(Items.MANGROVE_BOAT, Items.MANGROVE_CHEST_BOAT), - BAMBOO(Items.BAMBOO_RAFT, Items.BAMBOO_CHEST_RAFT), - CHERRY(Items.CHERRY_BOAT, Items.CHERRY_CHEST_BOAT), - PALE_OAK(Items.PALE_OAK_BOAT, Items.PALE_OAK_CHEST_BOAT); + OAK, + SPRUCE, + BIRCH, + JUNGLE, + ACACIA, + DARK_OAK, + MANGROVE, + BAMBOO, + CHERRY, + PALE_OAK; - private final Item pickItem; - final Item chestPickItem; - - BoatVariant(Item pickItem, Item chestPickItem) { - this.pickItem = pickItem; - this.chestPickItem = chestPickItem; - } + BoatVariant() {} } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/ChestBoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/ChestBoatEntity.java index 967da41df..5475ca772 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/ChestBoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/ChestBoatEntity.java @@ -27,7 +27,6 @@ package org.geysermc.geyser.entity.type; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; -import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; @@ -49,9 +48,4 @@ public class ChestBoatEntity extends BoatEntity { public InteractionResult interact(Hand hand) { return passengers.isEmpty() && !session.isSneaking() ? super.interact(hand) : InteractionResult.SUCCESS; } - - @Override - public Item getPickItem() { - return this.variant.chestPickItem; - } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java index 8b47ce1ed..0cd207c52 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/TextDisplayEntity.java @@ -25,18 +25,25 @@ package org.geysermc.geyser.entity.type; +import lombok.Getter; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.EntityMetadata; +import org.jetbrains.annotations.Nullable; import java.util.UUID; // Note: 1.19.4 requires that the billboard is set to something in order to show, on Java Edition +@Getter public class TextDisplayEntity extends DisplayBaseEntity { + + private int lineCount; + public TextDisplayEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position.add(0, definition.offset(), 0), motion, yaw, pitch, headYaw); } @@ -61,5 +68,14 @@ public class TextDisplayEntity extends DisplayBaseEntity { public void setText(EntityMetadata entityMetadata) { this.dirtyMetadata.put(EntityDataTypes.NAME, MessageTranslator.convertMessage(entityMetadata.getValue())); + calculateLineCount(entityMetadata.getValue()); + } + + private void calculateLineCount(@Nullable Component text) { + if (text == null) { + lineCount = 0; + return; + } + lineCount = PlainTextComponentSerializer.plainText().serialize(text).split("\n").length; } } diff --git a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java index a56e00671..10cbcf556 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java +++ b/core/src/main/java/org/geysermc/geyser/extension/GeyserExtensionLoader.java @@ -31,6 +31,7 @@ import lombok.RequiredArgsConstructor; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.api.util.ApiVersion; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.api.GeyserApi; import org.geysermc.geyser.api.event.ExtensionEventBus; import org.geysermc.geyser.api.extension.Extension; @@ -42,6 +43,7 @@ import org.geysermc.geyser.api.extension.exception.InvalidDescriptionException; import org.geysermc.geyser.api.extension.exception.InvalidExtensionException; import org.geysermc.geyser.extension.event.GeyserExtensionEventBus; import org.geysermc.geyser.text.GeyserLocale; +import org.geysermc.geyser.util.ThrowingBiConsumer; import java.io.IOException; import java.io.Reader; @@ -51,10 +53,12 @@ import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; import java.util.regex.Pattern; @RequiredArgsConstructor @@ -155,6 +159,7 @@ public class GeyserExtensionLoader extends ExtensionLoader { @Override protected void loadAllExtensions(@NonNull ExtensionManager extensionManager) { + GeyserLogger logger = GeyserImpl.getInstance().getLogger(); try { if (Files.notExists(extensionsDirectory)) { Files.createDirectory(extensionsDirectory); @@ -163,55 +168,68 @@ public class GeyserExtensionLoader extends ExtensionLoader { Map extensions = new LinkedHashMap<>(); Map loadedExtensions = new LinkedHashMap<>(); - Pattern[] extensionFilters = this.extensionFilters(); - List extensionPaths = Files.walk(extensionsDirectory).toList(); - extensionPaths.forEach(path -> { - if (Files.isDirectory(path)) { - return; - } + Path updateDirectory = extensionsDirectory.resolve("update"); + if (Files.isDirectory(updateDirectory)) { + // Step 1: Collect the extension files that currently exist so they can be replaced + Map> extensionFiles = new HashMap<>(); + this.processExtensionsFolder(extensionsDirectory, (path, description) -> { + extensionFiles.computeIfAbsent(description.id(), k -> new ArrayList<>()).add(path); + }, (path, e) -> { + // this file will throw again when we actually try to load extensions, and it will be handled there + }); - for (Pattern filter : extensionFilters) { - if (!filter.matcher(path.getFileName().toString()).matches()) { - return; - } - } - - try { - GeyserExtensionDescription description = this.extensionDescription(path); - - String name = description.name(); - String id = description.id(); - if (extensions.containsKey(id) || extensionManager.extension(id) != null) { - GeyserImpl.getInstance().getLogger().warning(GeyserLocale.getLocaleStringLog("geyser.extensions.load.duplicate", name, path.toString())); - return; - } - - // Check whether an extensions' requested api version is compatible - ApiVersion.Compatibility compatibility = GeyserApi.api().geyserApiVersion().supportsRequestedVersion( - description.humanApiVersion(), - description.majorApiVersion(), - description.minorApiVersion() - ); - - if (compatibility != ApiVersion.Compatibility.COMPATIBLE) { - // Workaround for the switch to the Geyser API version instead of the Base API version in extensions - if (compatibility == ApiVersion.Compatibility.HUMAN_DIFFER && description.humanApiVersion() == 1) { - GeyserImpl.getInstance().getLogger().warning("The extension %s requested the Base API version %s, which is deprecated in favor of specifying the Geyser API version. Please update the extension, or contact its developer." - .formatted(name, description.apiVersion())); - } else { - GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.extensions.load.failed_api_version", name, description.apiVersion())); - return; + // Step 2: Move the updated/new extensions + this.processExtensionsFolder(updateDirectory, (path, description) -> { + // Remove the old extension files with the same ID if it exists + List oldExtensionFiles = extensionFiles.get(description.id()); + if (oldExtensionFiles != null) { + for (Path oldExtensionFile : oldExtensionFiles) { + Files.delete(oldExtensionFile); } } - GeyserExtensionContainer container = this.loadExtension(path, description); - extensions.put(id, path); - loadedExtensions.put(id, container); - } catch (Throwable e) { - GeyserImpl.getInstance().getLogger().error(GeyserLocale.getLocaleStringLog("geyser.extensions.load.failed_with_name", path.getFileName(), path.toAbsolutePath()), e); + // Overwrite the extension with the new jar + Files.move(path, extensionsDirectory.resolve(path.getFileName()), StandardCopyOption.REPLACE_EXISTING); + }, (path, e) -> { + logger.error(GeyserLocale.getLocaleStringLog("geyser.extensions.update.failed", path.getFileName()), e); + }); + } + + // Step 3: Load the extensions + this.processExtensionsFolder(extensionsDirectory, (path, description) -> { + String name = description.name(); + String id = description.id(); + if (extensions.containsKey(id) || extensionManager.extension(id) != null) { + logger.warning(GeyserLocale.getLocaleStringLog("geyser.extensions.load.duplicate", name, path.toString())); + return; } + + // Check whether an extensions' requested api version is compatible + ApiVersion.Compatibility compatibility = GeyserApi.api().geyserApiVersion().supportsRequestedVersion( + description.humanApiVersion(), + description.majorApiVersion(), + description.minorApiVersion() + ); + + if (compatibility != ApiVersion.Compatibility.COMPATIBLE) { + // Workaround for the switch to the Geyser API version instead of the Base API version in extensions + if (compatibility == ApiVersion.Compatibility.HUMAN_DIFFER && description.humanApiVersion() == 1) { + logger.warning("The extension %s requested the Base API version %s, which is deprecated in favor of specifying the Geyser API version. Please update the extension, or contact its developer." + .formatted(name, description.apiVersion())); + } else { + logger.error(GeyserLocale.getLocaleStringLog("geyser.extensions.load.failed_api_version", name, description.apiVersion())); + return; + } + } + + GeyserExtensionContainer container = this.loadExtension(path, description); + extensions.put(id, path); + loadedExtensions.put(id, container); + }, (path, e) -> { + logger.error(GeyserLocale.getLocaleStringLog("geyser.extensions.load.failed_with_name", path.getFileName(), path.toAbsolutePath()), e); }); + // Step 4: Register the extensions for (GeyserExtensionContainer container : loadedExtensions.values()) { this.extensionContainers.put(container.extension(), container); this.register(container.extension(), extensionManager); @@ -221,6 +239,40 @@ public class GeyserExtensionLoader extends ExtensionLoader { } } + /** + * Process extension jars in a folder and call the accept or reject consumer based on the result + * + * @param directory the directory to process + * @param accept the consumer to call when an extension is accepted + * @param reject the consumer to call when an extension is rejected + * @throws IOException if an I/O error occurs + */ + private void processExtensionsFolder(Path directory, ThrowingBiConsumer accept, BiConsumer reject) throws IOException { + List extensionPaths = Files.list(directory).toList(); + Pattern[] extensionFilters = this.extensionFilters(); + extensionPaths.forEach(path -> { + if (Files.isDirectory(path)) { + return; + } + + // Only look at files that meet the extension filter + for (Pattern filter : extensionFilters) { + if (!filter.matcher(path.getFileName().toString()).matches()) { + return; + } + } + + try { + // Try load the description, so we know it's a valid extension + GeyserExtensionDescription description = this.extensionDescription(path); + + accept.acceptThrows(path, description); + } catch (Throwable e) { + reject.accept(path, e); + } + }); + } + @Override protected boolean isEnabled(@NonNull Extension extension) { return this.extensionContainers.get(extension).enabled; diff --git a/core/src/main/java/org/geysermc/geyser/level/MapColor.java b/core/src/main/java/org/geysermc/geyser/level/MapColor.java index a599f9146..f4b4fb697 100644 --- a/core/src/main/java/org/geysermc/geyser/level/MapColor.java +++ b/core/src/main/java/org/geysermc/geyser/level/MapColor.java @@ -30,26 +30,26 @@ public enum MapColor { COLOR_1(-1, -1, -1), COLOR_2(-1, -1, -1), COLOR_3(-1, -1, -1), - COLOR_4(89, 125, 39), - COLOR_5(109, 153, 48), - COLOR_6(127, 178, 56), - COLOR_7(67, 94, 29), - COLOR_8(174, 164, 115), - COLOR_9(213, 201, 140), - COLOR_10(247, 233, 163), - COLOR_11(130, 123, 86), + COLOR_4(39, 125, 89), + COLOR_5(48, 153, 109), + COLOR_6(56, 178, 127), + COLOR_7(29, 94, 67), + COLOR_8(115, 164, 174), + COLOR_9(140, 201, 213), + COLOR_10(163, 233, 247), + COLOR_11(86, 123, 130), COLOR_12(140, 140, 140), COLOR_13(171, 171, 171), COLOR_14(199, 199, 199), COLOR_15(105, 105, 105), - COLOR_16(180, 0, 0), - COLOR_17(220, 0, 0), - COLOR_18(255, 0, 0), - COLOR_19(135, 0, 0), - COLOR_20(112, 112, 180), - COLOR_21(138, 138, 220), - COLOR_22(160, 160, 255), - COLOR_23(84, 84, 135), + COLOR_16(0, 0, 180), + COLOR_17(0, 0, 220), + COLOR_18(0, 0, 255), + COLOR_19(0, 0, 135), + COLOR_20(180, 112, 112), + COLOR_21(220, 138, 138), + COLOR_22(255, 160, 160), + COLOR_23(135, 84, 84), COLOR_24(117, 117, 117), COLOR_25(144, 144, 144), COLOR_26(167, 167, 167), @@ -62,54 +62,54 @@ public enum MapColor { COLOR_33(220, 220, 220), COLOR_34(255, 255, 255), COLOR_35(135, 135, 135), - COLOR_36(115, 118, 129), - COLOR_37(141, 144, 158), - COLOR_38(164, 168, 184), - COLOR_39(86, 88, 97), - COLOR_40(106, 76, 54), - COLOR_41(130, 94, 66), - COLOR_42(151, 109, 77), - COLOR_43(79, 57, 40), + COLOR_36(129, 118, 115), + COLOR_37(158, 144, 141), + COLOR_38(184, 168, 164), + COLOR_39(97, 88, 86), + COLOR_40(54, 76, 106), + COLOR_41(66, 94, 130), + COLOR_42(77, 109, 151), + COLOR_43(40, 57, 79), COLOR_44(79, 79, 79), COLOR_45(96, 96, 96), COLOR_46(112, 112, 112), COLOR_47(59, 59, 59), - COLOR_48(45, 45, 180), - COLOR_49(55, 55, 220), - COLOR_50(64, 64, 255), - COLOR_51(33, 33, 135), - COLOR_52(100, 84, 50), - COLOR_53(123, 102, 62), - COLOR_54(143, 119, 72), - COLOR_55(75, 63, 38), - COLOR_56(180, 177, 172), - COLOR_57(220, 217, 211), - COLOR_58(255, 252, 245), - COLOR_59(135, 133, 129), - COLOR_60(152, 89, 36), - COLOR_61(186, 109, 44), - COLOR_62(216, 127, 51), - COLOR_63(114, 67, 27), - COLOR_64(125, 53, 152), - COLOR_65(153, 65, 186), - COLOR_66(178, 76, 216), - COLOR_67(94, 40, 114), - COLOR_68(72, 108, 152), - COLOR_69(88, 132, 186), - COLOR_70(102, 153, 216), - COLOR_71(54, 81, 114), - COLOR_72(161, 161, 36), - COLOR_73(197, 197, 44), - COLOR_74(229, 229, 51), - COLOR_75(121, 121, 27), - COLOR_76(89, 144, 17), - COLOR_77(109, 176, 21), - COLOR_78(127, 204, 25), - COLOR_79(67, 108, 13), - COLOR_80(170, 89, 116), - COLOR_81(208, 109, 142), - COLOR_82(242, 127, 165), - COLOR_83(128, 67, 87), + COLOR_48(180, 45, 45), + COLOR_49(220, 55, 55), + COLOR_50(255, 64, 64), + COLOR_51(135, 33, 33), + COLOR_52(50, 84, 100), + COLOR_53(62, 102, 123), + COLOR_54(72, 119, 143), + COLOR_55(38, 63, 75), + COLOR_56(172, 177, 180), + COLOR_57(211, 217, 220), + COLOR_58(245, 252, 255), + COLOR_59(129, 133, 135), + COLOR_60(36, 89, 152), + COLOR_61(44, 109, 186), + COLOR_62(51, 127, 216), + COLOR_63(27, 67, 114), + COLOR_64(152, 53, 125), + COLOR_65(186, 65, 153), + COLOR_66(216, 76, 178), + COLOR_67(114, 40, 94), + COLOR_68(152, 108, 72), + COLOR_69(186, 132, 88), + COLOR_70(216, 153, 102), + COLOR_71(114, 81, 54), + COLOR_72(36, 161, 161), + COLOR_73(44, 197, 197), + COLOR_74(51, 229, 229), + COLOR_75(27, 121, 121), + COLOR_76(17, 144, 89), + COLOR_77(21, 176, 109), + COLOR_78(25, 204, 127), + COLOR_79(13, 108, 67), + COLOR_80(116, 89, 170), + COLOR_81(142, 109, 208), + COLOR_82(165, 127, 242), + COLOR_83(87, 67, 128), COLOR_84(53, 53, 53), COLOR_85(65, 65, 65), COLOR_86(76, 76, 76), @@ -118,162 +118,162 @@ public enum MapColor { COLOR_89(132, 132, 132), COLOR_90(153, 153, 153), COLOR_91(81, 81, 81), - COLOR_92(53, 89, 108), - COLOR_93(65, 109, 132), - COLOR_94(76, 127, 153), - COLOR_95(40, 67, 81), - COLOR_96(89, 44, 125), - COLOR_97(109, 54, 153), - COLOR_98(127, 63, 178), - COLOR_99(67, 33, 94), - COLOR_100(36, 53, 125), - COLOR_101(44, 65, 153), - COLOR_102(51, 76, 178), - COLOR_103(27, 40, 94), - COLOR_104(72, 53, 36), - COLOR_105(88, 65, 44), - COLOR_106(102, 76, 51), - COLOR_107(54, 40, 27), - COLOR_108(72, 89, 36), - COLOR_109(88, 109, 44), - COLOR_110(102, 127, 51), - COLOR_111(54, 67, 27), - COLOR_112(108, 36, 36), - COLOR_113(132, 44, 44), - COLOR_114(153, 51, 51), - COLOR_115(81, 27, 27), + COLOR_92(108, 89, 53), + COLOR_93(132, 109, 65), + COLOR_94(153, 127, 76), + COLOR_95(81, 67, 40), + COLOR_96(125, 44, 89), + COLOR_97(153, 54, 109), + COLOR_98(178, 63, 127), + COLOR_99(94, 33, 67), + COLOR_100(125, 53, 36), + COLOR_101(153, 65, 44), + COLOR_102(178, 76, 51), + COLOR_103(94, 40, 27), + COLOR_104(36, 53, 72), + COLOR_105(44, 65, 88), + COLOR_106(51, 76, 102), + COLOR_107(27, 40, 54), + COLOR_108(36, 89, 72), + COLOR_109(44, 109, 88), + COLOR_110(51, 127, 102), + COLOR_111(27, 67, 54), + COLOR_112(36, 36, 108), + COLOR_113(44, 44, 132), + COLOR_114(51, 51, 153), + COLOR_115(27, 27, 81), COLOR_116(17, 17, 17), COLOR_117(21, 21, 21), COLOR_118(25, 25, 25), COLOR_119(13, 13, 13), - COLOR_120(176, 168, 54), - COLOR_121(215, 205, 66), - COLOR_122(250, 238, 77), - COLOR_123(132, 126, 40), - COLOR_124(64, 154, 150), - COLOR_125(79, 188, 183), - COLOR_126(92, 219, 213), - COLOR_127(48, 115, 112), - COLOR_128(52, 90, 180), - COLOR_129(63, 110, 220), - COLOR_130(74, 128, 255), - COLOR_131(39, 67, 135), - COLOR_132(0, 153, 40), - COLOR_133(0, 187, 50), - COLOR_134(0, 217, 58), - COLOR_135(0, 114, 30), - COLOR_136(91, 60, 34), - COLOR_137(111, 74, 42), - COLOR_138(129, 86, 49), - COLOR_139(68, 45, 25), - COLOR_140(79, 1, 0), - COLOR_141(96, 1, 0), - COLOR_142(112, 2, 0), - COLOR_143(59, 1, 0), - COLOR_144(147, 124, 113), - COLOR_145(180, 152, 138), - COLOR_146(209, 177, 161), - COLOR_147(110, 93, 85), - COLOR_148(112, 57, 25), - COLOR_149(137, 70, 31), - COLOR_150(159, 82, 36), - COLOR_151(84, 43, 19), - COLOR_152(105, 61, 76), - COLOR_153(128, 75, 93), - COLOR_154(149, 87, 108), - COLOR_155(78, 46, 57), - COLOR_156(79, 76, 97), - COLOR_157(96, 93, 119), - COLOR_158(112, 108, 138), - COLOR_159(59, 57, 73), - COLOR_160(131, 93, 25), - COLOR_161(160, 114, 31), - COLOR_162(186, 133, 36), - COLOR_163(98, 70, 19), - COLOR_164(72, 82, 37), - COLOR_165(88, 100, 45), - COLOR_166(103, 117, 53), - COLOR_167(54, 61, 28), - COLOR_168(112, 54, 55), - COLOR_169(138, 66, 67), - COLOR_170(160, 77, 78), - COLOR_171(84, 40, 41), - COLOR_172(40, 28, 24), - COLOR_173(49, 35, 30), - COLOR_174(57, 41, 35), - COLOR_175(30, 21, 18), - COLOR_176(95, 75, 69), - COLOR_177(116, 92, 84), - COLOR_178(135, 107, 98), - COLOR_179(71, 56, 51), - COLOR_180(61, 64, 64), - COLOR_181(75, 79, 79), - COLOR_182(87, 92, 92), - COLOR_183(46, 48, 48), - COLOR_184(86, 51, 62), - COLOR_185(105, 62, 75), - COLOR_186(122, 73, 88), - COLOR_187(64, 38, 46), - COLOR_188(53, 43, 64), - COLOR_189(65, 53, 79), - COLOR_190(76, 62, 92), - COLOR_191(40, 32, 48), - COLOR_192(53, 35, 24), - COLOR_193(65, 43, 30), - COLOR_194(76, 50, 35), - COLOR_195(40, 26, 18), - COLOR_196(53, 57, 29), - COLOR_197(65, 70, 36), - COLOR_198(76, 82, 42), - COLOR_199(40, 43, 22), - COLOR_200(100, 42, 32), - COLOR_201(122, 51, 39), - COLOR_202(142, 60, 46), - COLOR_203(75, 31, 24), - COLOR_204(26, 15, 11), - COLOR_205(31, 18, 13), - COLOR_206(37, 22, 16), - COLOR_207(19, 11, 8), - COLOR_208(133, 33, 34), - COLOR_209(163, 41, 42), - COLOR_210(189, 48, 49), - COLOR_211(100, 25, 25), - COLOR_212(104, 44, 68), - COLOR_213(127, 54, 83), - COLOR_214(148, 63, 97), - COLOR_215(78, 33, 51), - COLOR_216(64, 17, 20), - COLOR_217(79, 21, 25), - COLOR_218(92, 25, 29), - COLOR_219(48, 13, 15), - COLOR_220(15, 88, 94), - COLOR_221(18, 108, 115), - COLOR_222(22, 126, 134), - COLOR_223(11, 66, 70), - COLOR_224(40, 100, 98), - COLOR_225(50, 122, 120), - COLOR_226(58, 142, 140), - COLOR_227(30, 75, 74), - COLOR_228(60, 31, 43), - COLOR_229(74, 37, 53), - COLOR_230(86, 44, 62), - COLOR_231(45, 23, 32), - COLOR_232(14, 127, 93), - COLOR_233(17, 155, 114), - COLOR_234(20, 180, 133), - COLOR_235(10, 95, 70), + COLOR_120(54, 168, 176), + COLOR_121(66, 205, 215), + COLOR_122(77, 238, 250), + COLOR_123(40, 126, 132), + COLOR_124(150, 154, 64), + COLOR_125(183, 188, 79), + COLOR_126(213, 219, 92), + COLOR_127(112, 115, 48), + COLOR_128(180, 90, 52), + COLOR_129(220, 110, 63), + COLOR_130(255, 128, 74), + COLOR_131(135, 67, 39), + COLOR_132(40, 153, 0), + COLOR_133(50, 187, 0), + COLOR_134(58, 217, 0), + COLOR_135(30, 114, 0), + COLOR_136(34, 60, 91), + COLOR_137(42, 74, 111), + COLOR_138(49, 86, 129), + COLOR_139(25, 45, 68), + COLOR_140(0, 1, 79), + COLOR_141(0, 1, 96), + COLOR_142(0, 2, 112), + COLOR_143(0, 1, 59), + COLOR_144(113, 124, 147), + COLOR_145(138, 152, 180), + COLOR_146(161, 177, 209), + COLOR_147(85, 93, 110), + COLOR_148(25, 57, 112), + COLOR_149(31, 70, 137), + COLOR_150(36, 82, 159), + COLOR_151(19, 43, 84), + COLOR_152(76, 61, 105), + COLOR_153(93, 75, 128), + COLOR_154(108, 87, 149), + COLOR_155(57, 46, 78), + COLOR_156(97, 76, 79), + COLOR_157(119, 93, 96), + COLOR_158(138, 108, 112), + COLOR_159(73, 57, 59), + COLOR_160(25, 93, 131), + COLOR_161(31, 114, 160), + COLOR_162(36, 133, 186), + COLOR_163(19, 70, 98), + COLOR_164(37, 82, 72), + COLOR_165(45, 100, 88), + COLOR_166(53, 117, 103), + COLOR_167(28, 61, 54), + COLOR_168(55, 54, 112), + COLOR_169(67, 66, 138), + COLOR_170(78, 77, 160), + COLOR_171(41, 40, 84), + COLOR_172(24, 28, 40), + COLOR_173(30, 35, 49), + COLOR_174(35, 41, 57), + COLOR_175(18, 21, 30), + COLOR_176(69, 75, 95), + COLOR_177(84, 92, 116), + COLOR_178(98, 107, 135), + COLOR_179(51, 56, 71), + COLOR_180(64, 64, 61), + COLOR_181(79, 79, 75), + COLOR_182(92, 92, 87), + COLOR_183(48, 48, 46), + COLOR_184(62, 51, 86), + COLOR_185(75, 62, 105), + COLOR_186(88, 73, 122), + COLOR_187(46, 38, 64), + COLOR_188(64, 43, 53), + COLOR_189(79, 53, 65), + COLOR_190(92, 62, 76), + COLOR_191(48, 32, 40), + COLOR_192(24, 35, 53), + COLOR_193(30, 43, 65), + COLOR_194(35, 50, 76), + COLOR_195(18, 26, 40), + COLOR_196(29, 57, 53), + COLOR_197(36, 70, 65), + COLOR_198(42, 82, 76), + COLOR_199(22, 43, 40), + COLOR_200(32, 42, 100), + COLOR_201(39, 51, 122), + COLOR_202(46, 60, 142), + COLOR_203(24, 31, 75), + COLOR_204(11, 15, 26), + COLOR_205(13, 18, 31), + COLOR_206(16, 22, 37), + COLOR_207(8, 11, 19), + COLOR_208(34, 33, 133), + COLOR_209(42, 41, 163), + COLOR_210(49, 48, 189), + COLOR_211(25, 25, 100), + COLOR_212(68, 44, 104), + COLOR_213(83, 54, 127), + COLOR_214(97, 63, 148), + COLOR_215(51, 33, 78), + COLOR_216(20, 17, 64), + COLOR_217(25, 21, 79), + COLOR_218(29, 25, 92), + COLOR_219(15, 13, 48), + COLOR_220(94, 88, 15), + COLOR_221(115, 108, 18), + COLOR_222(134, 126, 22), + COLOR_223(70, 66, 11), + COLOR_224(98, 100, 40), + COLOR_225(120, 122, 50), + COLOR_226(140, 142, 58), + COLOR_227(74, 75, 30), + COLOR_228(43, 31, 60), + COLOR_229(53, 37, 74), + COLOR_230(62, 44, 86), + COLOR_231(32, 23, 45), + COLOR_232(93, 127, 14), + COLOR_233(114, 155, 17), + COLOR_234(133, 180, 20), + COLOR_235(70, 95, 10), COLOR_236(70, 70, 70), COLOR_237(86, 86, 86), COLOR_238(100, 100, 100), COLOR_239(52, 52, 52), - COLOR_240(152, 123, 103), - COLOR_241(186, 150, 126), - COLOR_242(216, 175, 147), - COLOR_243(114, 92, 77), - COLOR_244(89, 117, 105), - COLOR_245(109, 144, 129), - COLOR_246(127, 167, 150), - COLOR_247(67, 88, 79); + COLOR_240(103, 123, 152), + COLOR_241(126, 150, 186), + COLOR_242(147, 175, 216), + COLOR_243(77, 92, 114), + COLOR_244(105, 117, 89), + COLOR_245(129, 144, 109), + COLOR_246(150, 167, 127), + COLOR_247(79, 88, 67); private static final MapColor[] VALUES = values(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java index 386c795d2..d8547bbfc 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java @@ -55,7 +55,8 @@ public final class DataComponentRegistryPopulator { GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); List defaultComponents; try (InputStream stream = bootstrap.getResourceOrThrow("java/item_data_components.json")) { - JsonElement rootElement = JsonParser.parseReader(new InputStreamReader(stream)); + //noinspection deprecation - 1.16.5 breaks otherwise + JsonElement rootElement = new JsonParser().parse(new InputStreamReader(stream)); JsonArray jsonArray = rootElement.getAsJsonArray(); defaultComponents = new ObjectArrayList<>(jsonArray.size()); diff --git a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java index 034975b15..388162a49 100644 --- a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java @@ -209,6 +209,18 @@ public final class EntityUtils { zOffset = displayTranslation.getZ(); } } + case PLAYER -> { + if (passenger instanceof TextDisplayEntity textDisplay) { + Vector3f displayTranslation = textDisplay.getTranslation(); + int lines = textDisplay.getLineCount(); + if (displayTranslation != null && lines != 0) { + float multiplier = .1414f; + xOffset = displayTranslation.getX(); + yOffset += displayTranslation.getY() + multiplier * lines; + zOffset = displayTranslation.getZ(); + } + } + } } if (mount instanceof ChestBoatEntity) { xOffset = 0.15F; diff --git a/core/src/main/java/org/geysermc/geyser/util/ThrowingBiConsumer.java b/core/src/main/java/org/geysermc/geyser/util/ThrowingBiConsumer.java new file mode 100644 index 000000000..96adbb5c9 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/util/ThrowingBiConsumer.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024 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.geyser.util; + +import java.util.function.BiConsumer; + +@FunctionalInterface +public interface ThrowingBiConsumer extends BiConsumer { + @Override + default void accept(T t, U u) { + try { + acceptThrows(t, u); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } + + void acceptThrows(T t, U u) throws Throwable; +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1166bab35..b90436644 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,9 +10,9 @@ netty-io-uring = "0.0.25.Final-SNAPSHOT" guava = "29.0-jre" gson = "2.3.1" # Provided by Spigot 1.8.8 websocket = "1.5.1" -protocol-connection = "3.0.0.Beta5-20241203.200249-19" -protocol-common = "3.0.0.Beta5-20241203.200249-19" -protocol-codec = "3.0.0.Beta5-20241203.200249-19" +protocol-connection = "3.0.0.Beta5-20241213.160944-20" +protocol-common = "3.0.0.Beta5-20241213.160944-20" +protocol-codec = "3.0.0.Beta5-20241213.160944-20" raknet = "1.0.0.CR3-20240416.144209-1" minecraftauth = "4.1.1" mcprotocollib = "1.21.4-SNAPSHOT"