diff --git a/patches/api/0005-Hide-irrelevant-compilation-warnings.patch b/patches/api/0005-Hide-irrelevant-compilation-warnings.patch index 61224644..adc2937e 100644 --- a/patches/api/0005-Hide-irrelevant-compilation-warnings.patch +++ b/patches/api/0005-Hide-irrelevant-compilation-warnings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Hide irrelevant compilation warnings diff --git a/build.gradle.kts b/build.gradle.kts -index bf01892c248b988531d21d9fb0f74d0adf2205ac..e2e11d760f497713f100f9b564f2fc898993c57d 100644 +index 04853c43b99951bf0d4c96ef73724625bdaf018f..e9e580d777534a56866413d6ca48f4aa269ec33f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -109,6 +109,15 @@ val generateApiVersioningFile by tasks.registering { diff --git a/patches/api/0006-SIMD-support.patch b/patches/api/0006-SIMD-support.patch index ddc80482..b10c71f5 100644 --- a/patches/api/0006-SIMD-support.patch +++ b/patches/api/0006-SIMD-support.patch @@ -5,7 +5,7 @@ Subject: [PATCH] SIMD support diff --git a/build.gradle.kts b/build.gradle.kts -index e2e11d760f497713f100f9b564f2fc898993c57d..fa4c21e6b0f7f87d153db8211c1fd10f2bc22011 100644 +index e9e580d777534a56866413d6ca48f4aa269ec33f..e0f2438944bda900f3a6391797e7842647b844be 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -115,6 +115,7 @@ tasks.withType { diff --git a/patches/api/0007-Leaves-API-publish.patch b/patches/api/0007-Leaves-API-publish.patch index 253ea3a7..fb83dded 100644 --- a/patches/api/0007-Leaves-API-publish.patch +++ b/patches/api/0007-Leaves-API-publish.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Leaves API publish diff --git a/build.gradle.kts b/build.gradle.kts -index fa4c21e6b0f7f87d153db8211c1fd10f2bc22011..11c29efa3798341ace33ad35fac95065d72e8f21 100644 +index e0f2438944bda900f3a6391797e7842647b844be..bb020dc0ad0cbc1d342966dbf5fce9d11547f56e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -212,3 +212,14 @@ tasks.check { diff --git a/patches/api/0011-Bytebuf-API.patch b/patches/api/0011-Bytebuf-API.patch new file mode 100644 index 00000000..82208f64 --- /dev/null +++ b/patches/api/0011-Bytebuf-API.patch @@ -0,0 +1,224 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lumine1909 <3556577839@qq.com> +Date: Fri, 12 Apr 2024 20:12:33 -0400 +Subject: [PATCH] bytebuf-api + + +diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java +index 7e92a652d47042dec050e4be08b57e2121ccd0bb..4adddf3695de8e18088a206ffcc077017f69839c 100644 +--- a/src/main/java/org/bukkit/Bukkit.java ++++ b/src/main/java/org/bukkit/Bukkit.java +@@ -2897,6 +2897,14 @@ public final class Bukkit { + return server.getPhotographerManager(); + } + // Leaves end - Photographer API ++ // Leaves start - Bytebuf API ++ public static @NotNull org.leavesmc.leaves.packet.bytebuf.Bytebuf newByteBuf() { ++ return server.newByteBuf(); ++ } ++ public static @NotNull org.leavesmc.leaves.packet.bytebuf.Bytebuf newByteBuf(int initalCapability) { ++ return server.newByteBuf(initalCapability); ++ } ++ // Leaves end - Bytebuf API + + @NotNull + public static Server.Spigot spigot() { +diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java +index d465633aab75def37a2b4a9f2a034071970c1dfa..cf9d17b68f27d08a6a6f6c564874370a9788f72e 100644 +--- a/src/main/java/org/bukkit/Server.java ++++ b/src/main/java/org/bukkit/Server.java +@@ -2540,4 +2540,9 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi + // Leaves start - Photographer API + @NotNull PhotographerManager getPhotographerManager(); + // Leaves end - Photographer API ++ // Leaves start - Bytebuf API ++ @NotNull org.leavesmc.leaves.packet.bytebuf.Bytebuf newByteBuf(); ++ @NotNull org.leavesmc.leaves.packet.bytebuf.Bytebuf newByteBuf(int initalCapability); ++ ++ // Leaves end - Bytebuf API + } +diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java +index c6cb4f17469a8f2e60dd3e28d41402851ce5fb21..ab62a61b6ba69fa07ca68cec79c4074fd8b54a96 100644 +--- a/src/main/java/org/bukkit/entity/Player.java ++++ b/src/main/java/org/bukkit/entity/Player.java +@@ -3706,6 +3706,10 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM + */ + void resetIdleDuration(); + // Paper end ++ // Leaves start - Bytebuf API ++ void sendPacket(org.leavesmc.leaves.packet.Packet packet); ++ void sendPacket(org.leavesmc.leaves.packet.bytebuf.Bytebuf buf, org.leavesmc.leaves.packet.PacketType packetType); ++ // Leaves end - Bytebuf API + + @NotNull + @Override +diff --git a/src/main/java/org/leavesmc/leaves/packet/Packet.java b/src/main/java/org/leavesmc/leaves/packet/Packet.java +new file mode 100644 +index 0000000000000000000000000000000000000000..0ea5069b994eb3da2952f696c1fd1bc0e81e281a +--- /dev/null ++++ b/src/main/java/org/leavesmc/leaves/packet/Packet.java +@@ -0,0 +1,8 @@ ++package org.leavesmc.leaves.packet; ++ ++import org.leavesmc.leaves.packet.bytebuf.Bytebuf; ++ ++public interface Packet { ++ PacketType getType(); ++ Bytebuf getBytebuf(); ++} +diff --git a/src/main/java/org/leavesmc/leaves/packet/PacketType.java b/src/main/java/org/leavesmc/leaves/packet/PacketType.java +new file mode 100644 +index 0000000000000000000000000000000000000000..3cf5792ddb7aa52580c4d91c2ddef593a43212af +--- /dev/null ++++ b/src/main/java/org/leavesmc/leaves/packet/PacketType.java +@@ -0,0 +1,115 @@ ++package org.leavesmc.leaves.packet; ++ ++/*** ++ * TODO: API comment ++ */ ++public enum PacketType { ++ ClientboundAddEntity, ++ ClientboundAddExperienceOrb, ++ ClientboundAnimate, ++ ClientboundAwardStats, ++ ClientboundBlockChangedAck, ++ ClientboundBlockDestruction, ++ ClientboundBlockEntityData, ++ ClientboundBlockEvent, ++ ClientboundBlockUpdate, ++ ClientboundBossEvent, ++ // ClientboundBundle, Not a regular packet, see https://wiki.vg/Protocol#Bundle_Delimiter ++ ClientboundChangeDifficulty, ++ ClientboundChunkBatchFinished, ++ ClientboundChunkBatchStart, ++ ClientboundChunksBiomes, ++ ClientboundClearTitles, ++ ClientboundCommands, ++ ClientboundCommandSuggestions, ++ ClientboundContainerClose, ++ ClientboundContainerSetContent, ++ ClientboundContainerSetData, ++ ClientboundContainerSetSlot, ++ ClientboundCooldown, ++ ClientboundCustomChatCompletions, ++ ClientboundDamageEvent, ++ ClientboundDeleteChat, ++ ClientboundDisguisedChat, ++ ClientboundEntityEvent, ++ ClientboundExplode, ++ ClientboundForgetLevelChunk, ++ ClientboundGameEvent, ++ ClientboundHorseScreenOpen, ++ ClientboundHurtAnimation, ++ ClientboundInitializeBorder, ++ ClientboundLevelChunkWithLight, ++ ClientboundLevelEvent, ++ ClientboundLevelParticles, ++ ClientboundLightUpdate, ++ ClientboundLightUpdatePack, ++ ClientboundLogin, ++ ClientboundMapItemData, ++ ClientboundMerchantOffers, ++ // ClientboundMoveEntity, Abstract class ++ ClientboundMoveVehicle, ++ ClientboundOpenBook, ++ ClientboundOpenScreen, ++ ClientboundOpenSignEditor, ++ ClientboundPlaceGhostRecipe, ++ ClientboundPlayerAbilities, ++ ClientboundPlayerChat, ++ ClientboundPlayerCombatEnd, ++ ClientboundPlayerCombatEnter, ++ ClientboundPlayerCombatKill, ++ ClientboundPlayerInfoRemove, ++ ClientboundPlayerInfoUpdate, ++ ClientboundPlayerLookAt, ++ ClientboundPlayerPosition, ++ ClientboundRecipe, ++ ClientboundRemoveEntities, ++ ClientboundRemoveMobEffect, ++ ClientboundResetScore, ++ ClientboundRespawn, ++ ClientboundRotateHead, ++ ClientboundSectionBlocksUpdate, ++ ClientboundSelectAdvancementsTab, ++ ClientboundServerData, ++ ClientboundSetActionBarText, ++ ClientboundSetBorderCenter, ++ ClientboundSetBorderLerpSize, ++ ClientboundSetBorderSize, ++ ClientboundSetBorderWarningDelay, ++ ClientboundSetBorderWarningDistance, ++ ClientboundSetCamera, ++ ClientboundSetCarriedItem, ++ ClientboundSetChunkCacheCenter, ++ ClientboundSetChunkCacheRadius, ++ ClientboundSetDefaultSpawnPosition, ++ ClientboundSetDisplayObjective, ++ ClientboundSetEntityData, ++ ClientboundSetEntityLink, ++ ClientboundSetEntityMotion, ++ ClientboundSetEquipment, ++ ClientboundSetExperience, ++ ClientboundSetHealth, ++ ClientboundSetObjective, ++ ClientboundSetPassengers, ++ ClientboundSetPlayerTeam, ++ ClientboundSetScore, ++ ClientboundSetSimulationDistance, ++ ClientboundSetSubtitleText, ++ ClientboundSetTime, ++ ClientboundSetTitlesAnimation, ++ ClientboundSetTitleText, ++ ClientboundSoundEntity, ++ ClientboundSound, ++ ClientboundStartConfiguration, ++ ClientboundStopSound, ++ ClientboundSystemChat, ++ ClientboundTabList, ++ ClientboundTagQuery, ++ ClientboundTakeItemEntity, ++ ClientboundTeleportEntity, ++ ClientboundTickingState, ++ ClientboundTickingStep, ++ ClientboundUpdateAdvancements, ++ ClientboundUpdateAttributes, ++ ClientboundUpdateMobEffect, ++ ClientboundUpdateRecipes ++} +diff --git a/src/main/java/org/leavesmc/leaves/packet/bytebuf/Bytebuf.java b/src/main/java/org/leavesmc/leaves/packet/bytebuf/Bytebuf.java +new file mode 100644 +index 0000000000000000000000000000000000000000..78a49c0d86742bc98f6b1434cba00a735982fd7a +--- /dev/null ++++ b/src/main/java/org/leavesmc/leaves/packet/bytebuf/Bytebuf.java +@@ -0,0 +1,29 @@ ++package org.leavesmc.leaves.packet.bytebuf; ++ ++import org.bukkit.inventory.ItemStack; ++import org.leavesmc.leaves.packet.Packet; ++import org.leavesmc.leaves.packet.PacketType; ++ ++import java.util.UUID; ++ ++public interface Bytebuf { ++ Packet toPacket(PacketType type); ++ Bytebuf writeByte(int i); ++ Bytebuf writeBoolean(boolean flag); ++ Bytebuf writeFloat(float f); ++ Bytebuf writeInt(int i); ++ Bytebuf writeShort(int i); ++ Bytebuf writeLong(long i); ++ Bytebuf writeVarInt(int value); ++ Bytebuf writeUUID(UUID uuid); ++ Bytebuf writeVarLong(long value); ++ ++ /* ++ In order to bypass NMS in the API, use deserialization of Object here. ++ In the future, it may be adjusted to use API encapsulated content (workload++). ++ */ ++ Bytebuf writeStringNbt(String nbt); ++ Bytebuf writeStringComponent(String component); ++ Bytebuf writeItem(ItemStack itemStack); ++ ++} diff --git a/patches/server/0102-Zero-tick-plants.patch b/patches/server/0102-Zero-tick-plants.patch index 60909aee..20233b56 100644 --- a/patches/server/0102-Zero-tick-plants.patch +++ b/patches/server/0102-Zero-tick-plants.patch @@ -22,7 +22,7 @@ index e8dc4ea90d74036dacb0785fcb9125df192a4c22..80284b01b7dc08659b4daf631ba820a4 @Override diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index 232a3a0332d8d2c1ec625f3f2155316c69d95153..82dc22271ff425b228086e1e0da52404dc7cbb74 100644 +index ba4aaf850af36a84517c70581e141157c4f15b99..46ea78ae8f78d70dd4d2b5d51749757e40b31a7d 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java @@ -46,8 +46,11 @@ public class CactusBlock extends Block { diff --git a/patches/server/0105-Add-Leaves-Auto-Update.patch b/patches/server/0105-Add-Leaves-Auto-Update.patch index d8000b85..f2964832 100644 --- a/patches/server/0105-Add-Leaves-Auto-Update.patch +++ b/patches/server/0105-Add-Leaves-Auto-Update.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add Leaves Auto Update diff --git a/src/main/java/top/leavesmc/leaves/util/LeavesUpdateHelper.java b/src/main/java/top/leavesmc/leaves/util/LeavesUpdateHelper.java -index e7060b91a27b1d0cddb14c155caaa0e78a043e20..68400212f121f57d3dfa0c3e5ccb2346ae95eb02 100644 +index 8ed3d15ebea4d8cfa134f331bd49d38fb2219b9a..e2fe17e6d536981bf4c2df40d55bf1f5ae83471b 100644 --- a/src/main/java/top/leavesmc/leaves/util/LeavesUpdateHelper.java +++ b/src/main/java/top/leavesmc/leaves/util/LeavesUpdateHelper.java @@ -7,8 +7,11 @@ import com.google.gson.JsonElement; diff --git a/patches/server/0106-Replay-Mod-API.patch b/patches/server/0106-Replay-Mod-API.patch index 8b3776a4..77b7158c 100644 --- a/patches/server/0106-Replay-Mod-API.patch +++ b/patches/server/0106-Replay-Mod-API.patch @@ -94,7 +94,7 @@ index 676a1499747b071515479130875157263d3a8352..e5ef298dc1df9cc42b3d349939a966b7 if (((List) object).size() >= i) { return (List) object; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 1684ea38e395af6236e88ebaeb008526de9f1b4e..2cfdc70b62ff1e2ff0d333b22af1e68da2daf6dc 100644 +index ee9031bbb0dde7394c1fdb6f3cc0f5f87361a97f..9478d8da5d7c7c594d5629aba3042b5ef141da04 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1606,7 +1606,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop builder = ImmutableMap.builder(); BiConsumer biConsumer = builder::put; diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 2882d720f2b4fbc5f00cfe45a80f48e7810c1424..693bbcd26ee7b286f045ed08cfa6ec0c5ae2c938 100644 +index 6725bbf2d966ae900e9b5efa619875c386bb9526..5ddeae61955be0e212db8467804aa42a88f61f04 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -222,6 +222,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface diff --git a/patches/server/0110-Wool-Hopper-Counter.patch b/patches/server/0110-Wool-Hopper-Counter.patch index 7a15fe55..a8bfc59b 100644 --- a/patches/server/0110-Wool-Hopper-Counter.patch +++ b/patches/server/0110-Wool-Hopper-Counter.patch @@ -19,7 +19,7 @@ index 7c29750e534eae4266bf7a63c50e3827401d6569..ab9a8c428975d016fbfa210b3a8cb531 public ItemStack[] itemStacks; @Nullable diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index bc130649e30928bae2d7764b616cd2b02e0f2204..e125c2baba0513595af269a0b6e06cf074305266 100644 +index 006e990d57c7ad1081f63402ef85a3ba856fe329..5e01a9b3ef4574280475bef5d7b06635766f756d 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java @@ -445,6 +445,13 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen diff --git a/patches/server/0115-Servux-Protocol.patch b/patches/server/0115-Servux-Protocol.patch index a3e1cd68..c8c40f52 100644 --- a/patches/server/0115-Servux-Protocol.patch +++ b/patches/server/0115-Servux-Protocol.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Servux Protocol diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 8d1b9391eb01ebf85d096e9c211629aef1034482..b78b712e9b28d17ad2632e652aa876a698f8b0bc 100644 +index 46230b09fc176665ba1d29ab3233c3b956a07710..abef121b9882c17a200e9f0186ee12634b8f8dfc 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java @@ -934,6 +934,7 @@ public class LevelChunk extends ChunkAccess { diff --git a/patches/server/0118-Disable-offline-warn-if-use-proxy.patch b/patches/server/0118-Disable-offline-warn-if-use-proxy.patch index 5d108a81..5cf2a652 100644 --- a/patches/server/0118-Disable-offline-warn-if-use-proxy.patch +++ b/patches/server/0118-Disable-offline-warn-if-use-proxy.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Disable offline warn if use proxy diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 9b4ca17240279ca8c64a8c39bf0915a9df0427df..acfb5fa89021f9605bfc271008341c86590b0fe5 100644 +index 5ddeae61955be0e212db8467804aa42a88f61f04..142d2f21f171d45180a89946f0e3ece2101258be 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -284,7 +284,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface diff --git a/patches/server/0119-Disable-moved-wrongly-threshold.patch b/patches/server/0119-Disable-moved-wrongly-threshold.patch index 536c457e..d22a01e9 100644 --- a/patches/server/0119-Disable-moved-wrongly-threshold.patch +++ b/patches/server/0119-Disable-moved-wrongly-threshold.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Disable moved wrongly threshold diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 3e212eb7a16309511f644170055c282e3d15f9b5..1209732aaa9cd8d08a188985b1385eb6c306313e 100644 +index cb1b08063abf7cf2c1b44922b2d9f50ccf0effa7..f29dd46b7a4c20df21fbcbbb5b5c4bb5440700fd 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -555,7 +555,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl diff --git a/patches/server/0121-Make-Item-tick-vanilla.patch b/patches/server/0121-Make-Item-tick-vanilla.patch index 4810b635..c3f21525 100644 --- a/patches/server/0121-Make-Item-tick-vanilla.patch +++ b/patches/server/0121-Make-Item-tick-vanilla.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Make Item tick vanilla diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index 45dc79f877bbb4a5384c21a32dc009270b8dc021..83c324c869802b3aaae8d0820113a9a49abad0c4 100644 +index ffa9fe429ed773db25a5e1020283b12597a69070..feb3fb984f6e6ed70992a038649249a9d3a9c938 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java @@ -252,6 +252,9 @@ public class ItemEntity extends Entity implements TraceableEntity { diff --git a/patches/server/0127-Placing-locked-hopper-no-longer-send-NC-updates.patch b/patches/server/0127-Placing-locked-hopper-no-longer-send-NC-updates.patch index d9dd05fb..c11cd03d 100644 --- a/patches/server/0127-Placing-locked-hopper-no-longer-send-NC-updates.patch +++ b/patches/server/0127-Placing-locked-hopper-no-longer-send-NC-updates.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Placing locked hopper no longer send NC updates diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 35eba785e68e400f5651a085c60f1f8acea333e9..6ae44fbb17b70ba00a1ac17d9cc781c2844ea3e7 100644 +index b219ff03ae82b9d94ba32304671428cf9987329a..5734c5d07df65cbb01c7d5c130a6fd3a078e22bc 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -49,6 +49,7 @@ import net.minecraft.world.level.biome.BiomeManager; diff --git a/patches/server/0131-Fast-resume.patch b/patches/server/0131-Fast-resume.patch index 9efd5011..6f287491 100644 --- a/patches/server/0131-Fast-resume.patch +++ b/patches/server/0131-Fast-resume.patch @@ -66,7 +66,7 @@ index c2eb3e8b019dbc0543a2308d7e88e324aa265cfe..22ffaeb54f618ccc8170d037eeaa4e25 return this.removeTicketAtLevel(type, CoordinateUtils.getChunkKey(chunkPos), level, identifier); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 0f904af56854b8b8da01220bbcca3e044c730848..353cce9cb767704b5851c64ce45e72a060687aa3 100644 +index 9478d8da5d7c7c594d5629aba3042b5ef141da04..7d1cd7b98e44e0b6c0d1f29df25ad45c0946548d 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -663,6 +663,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop +Date: Fri, 12 Apr 2024 20:13:20 -0400 +Subject: [PATCH] bytebuf-api-impl + + +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index 70b4f5dc96e285184bd3e676397c6bddd193db37..5e2b61e191f29c59d614c0f3f5bcc17bbd9d1700 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -3288,4 +3288,15 @@ public final class CraftServer implements Server { + return photographerManager; + } + // Leaves end - replay mod api ++ // Leaves start - Bytebuf API ++ @Override ++ public @Nonnull org.leavesmc.leaves.packet.bytebuf.Bytebuf newByteBuf() { ++ return new org.leavesmc.leaves.packet.bytebuf.WrappedBytebuf(); ++ } ++ ++ @Override ++ public @Nonnull org.leavesmc.leaves.packet.bytebuf.Bytebuf newByteBuf(int initalCapability) { ++ return new org.leavesmc.leaves.packet.bytebuf.WrappedBytebuf(initalCapability); ++ } ++ // Leaves end - Bytebuf API + } +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index 578343e048bc48d36cd6d26dcebb6f7567913b13..4cf5cd83653ff8de2cd4fe62630ed26b07df9ebd 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -3388,6 +3388,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + public void resetIdleDuration() { + this.getHandle().resetLastActionTime(); + } ++ // Leaves start - Bytebuf API ++ @Override ++ public void sendPacket(org.leavesmc.leaves.packet.Packet packet) { ++ this.getHandle().connection.send(((org.leavesmc.leaves.packet.WrappedPacket) packet).getNmsPacket()); ++ } ++ @Override ++ public void sendPacket(org.leavesmc.leaves.packet.bytebuf.Bytebuf buf, org.leavesmc.leaves.packet.PacketType packetType) { ++ org.leavesmc.leaves.packet.Packet packet = buf.toPacket(packetType); ++ this.getHandle().connection.send(((org.leavesmc.leaves.packet.WrappedPacket) packet).getNmsPacket()); ++ } ++ // Leaves end - Bytebuf API + // Paper end + + public Player.Spigot spigot() +diff --git a/src/main/java/org/leavesmc/leaves/packet/WrappedPacket.java b/src/main/java/org/leavesmc/leaves/packet/WrappedPacket.java +new file mode 100644 +index 0000000000000000000000000000000000000000..dc0dde18d3ae300657d92e20ae3e17136b8b72f4 +--- /dev/null ++++ b/src/main/java/org/leavesmc/leaves/packet/WrappedPacket.java +@@ -0,0 +1,140 @@ ++package org.leavesmc.leaves.packet; ++ ++import net.minecraft.network.protocol.game.*; ++import org.leavesmc.leaves.packet.bytebuf.Bytebuf; ++import org.leavesmc.leaves.packet.bytebuf.WrappedBytebuf; ++ ++public class WrappedPacket implements Packet { ++ private final PacketType type; ++ private final Bytebuf wrappedBytebuf; ++ net.minecraft.network.protocol.Packet nmsPacket; ++ public WrappedPacket(PacketType type, WrappedBytebuf buf) { ++ this.type = type; ++ this.wrappedBytebuf = buf; ++ try { ++ switch (type) { ++ case ClientboundAddEntity -> nmsPacket = new ClientboundAddEntityPacket(buf.getFriendlyByteBuf()); ++ case ClientboundAddExperienceOrb -> nmsPacket = new ClientboundAddExperienceOrbPacket(buf.getFriendlyByteBuf()); ++ case ClientboundAnimate -> nmsPacket = new ClientboundAnimatePacket(buf.getFriendlyByteBuf()); ++ case ClientboundAwardStats -> nmsPacket = new ClientboundAwardStatsPacket(buf.getFriendlyByteBuf()); ++ case ClientboundBlockChangedAck -> nmsPacket = new ClientboundBlockChangedAckPacket(buf.getFriendlyByteBuf()); ++ case ClientboundBlockDestruction -> nmsPacket = new ClientboundBlockDestructionPacket(buf.getFriendlyByteBuf()); ++ case ClientboundBlockEntityData -> nmsPacket = new ClientboundBlockEntityDataPacket(buf.getFriendlyByteBuf()); ++ case ClientboundBlockEvent -> nmsPacket = new ClientboundBlockEventPacket(buf.getFriendlyByteBuf()); ++ case ClientboundBlockUpdate -> nmsPacket = new ClientboundBlockUpdatePacket(buf.getFriendlyByteBuf()); ++ case ClientboundBossEvent -> nmsPacket = new ClientboundBossEventPacket(buf.getFriendlyByteBuf()); ++ case ClientboundChangeDifficulty -> nmsPacket = new ClientboundChangeDifficultyPacket(buf.getFriendlyByteBuf()); ++ case ClientboundChunkBatchFinished -> nmsPacket = new ClientboundChunkBatchFinishedPacket(buf.getFriendlyByteBuf()); ++ case ClientboundChunkBatchStart -> nmsPacket = new ClientboundChunkBatchStartPacket(buf.getFriendlyByteBuf()); ++ case ClientboundChunksBiomes -> nmsPacket = new ClientboundChunksBiomesPacket(buf.getFriendlyByteBuf()); ++ case ClientboundClearTitles -> nmsPacket = new ClientboundClearTitlesPacket(buf.getFriendlyByteBuf()); ++ case ClientboundCommands -> nmsPacket = new ClientboundCommandsPacket(buf.getFriendlyByteBuf()); ++ case ClientboundCommandSuggestions -> nmsPacket = new ClientboundCommandSuggestionsPacket(buf.getFriendlyByteBuf()); ++ case ClientboundContainerClose -> nmsPacket = new ClientboundContainerClosePacket(buf.getFriendlyByteBuf()); ++ case ClientboundContainerSetContent -> nmsPacket = new ClientboundContainerSetContentPacket(buf.getFriendlyByteBuf()); ++ case ClientboundContainerSetData -> nmsPacket = new ClientboundContainerSetDataPacket(buf.getFriendlyByteBuf()); ++ case ClientboundContainerSetSlot -> nmsPacket = new ClientboundContainerSetSlotPacket(buf.getFriendlyByteBuf()); ++ case ClientboundCooldown -> nmsPacket = new ClientboundCooldownPacket(buf.getFriendlyByteBuf()); ++ case ClientboundCustomChatCompletions -> nmsPacket = new ClientboundCustomChatCompletionsPacket(buf.getFriendlyByteBuf()); ++ case ClientboundDamageEvent -> nmsPacket = new ClientboundDamageEventPacket(buf.getFriendlyByteBuf()); ++ case ClientboundDeleteChat -> nmsPacket = new ClientboundDeleteChatPacket(buf.getFriendlyByteBuf()); ++ case ClientboundDisguisedChat -> nmsPacket = new ClientboundDisguisedChatPacket(buf.getFriendlyByteBuf()); ++ case ClientboundEntityEvent -> nmsPacket = new ClientboundEntityEventPacket(buf.getFriendlyByteBuf()); ++ case ClientboundExplode -> nmsPacket = new ClientboundExplodePacket(buf.getFriendlyByteBuf()); ++ case ClientboundForgetLevelChunk -> nmsPacket = new ClientboundForgetLevelChunkPacket(buf.getFriendlyByteBuf()); ++ case ClientboundGameEvent -> nmsPacket = new ClientboundGameEventPacket(buf.getFriendlyByteBuf()); ++ case ClientboundHorseScreenOpen -> nmsPacket = new ClientboundHorseScreenOpenPacket(buf.getFriendlyByteBuf()); ++ case ClientboundHurtAnimation -> nmsPacket = new ClientboundHurtAnimationPacket(buf.getFriendlyByteBuf()); ++ case ClientboundInitializeBorder -> nmsPacket = new ClientboundInitializeBorderPacket(buf.getFriendlyByteBuf()); ++ case ClientboundLevelChunkWithLight -> nmsPacket = new ClientboundLevelChunkWithLightPacket(buf.getFriendlyByteBuf()); ++ case ClientboundLevelEvent -> nmsPacket = new ClientboundLevelEventPacket(buf.getFriendlyByteBuf()); ++ case ClientboundLevelParticles -> nmsPacket = new ClientboundLevelParticlesPacket(buf.getFriendlyByteBuf()); ++ case ClientboundLightUpdate -> nmsPacket = new ClientboundLightUpdatePacket(buf.getFriendlyByteBuf()); ++ case ClientboundLogin -> nmsPacket = new ClientboundLoginPacket(buf.getFriendlyByteBuf()); ++ case ClientboundMapItemData -> nmsPacket = new ClientboundMapItemDataPacket(buf.getFriendlyByteBuf()); ++ case ClientboundMerchantOffers -> nmsPacket = new ClientboundMerchantOffersPacket(buf.getFriendlyByteBuf()); ++ case ClientboundMoveVehicle -> nmsPacket = new ClientboundMoveVehiclePacket(buf.getFriendlyByteBuf()); ++ case ClientboundOpenBook -> nmsPacket = new ClientboundOpenBookPacket(buf.getFriendlyByteBuf()); ++ case ClientboundOpenScreen -> nmsPacket = new ClientboundOpenScreenPacket(buf.getFriendlyByteBuf()); ++ case ClientboundOpenSignEditor -> nmsPacket = new ClientboundOpenSignEditorPacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlaceGhostRecipe -> nmsPacket = new ClientboundPlaceGhostRecipePacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerAbilities -> nmsPacket = new ClientboundPlayerAbilitiesPacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerChat -> nmsPacket = new ClientboundPlayerChatPacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerCombatEnd -> nmsPacket = new ClientboundPlayerCombatEndPacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerCombatEnter -> nmsPacket = new ClientboundPlayerCombatEnterPacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerCombatKill -> nmsPacket = new ClientboundPlayerCombatKillPacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerInfoRemove -> nmsPacket = new ClientboundPlayerInfoRemovePacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerInfoUpdate -> nmsPacket = new ClientboundPlayerInfoUpdatePacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerLookAt -> nmsPacket = new ClientboundPlayerLookAtPacket(buf.getFriendlyByteBuf()); ++ case ClientboundPlayerPosition -> nmsPacket = new ClientboundPlayerPositionPacket(buf.getFriendlyByteBuf()); ++ case ClientboundRecipe -> nmsPacket = new ClientboundRecipePacket(buf.getFriendlyByteBuf()); ++ case ClientboundRemoveEntities -> nmsPacket = new ClientboundRemoveEntitiesPacket(buf.getFriendlyByteBuf()); ++ case ClientboundRemoveMobEffect -> nmsPacket = new ClientboundRemoveMobEffectPacket(buf.getFriendlyByteBuf()); ++ case ClientboundResetScore -> nmsPacket = new ClientboundResetScorePacket(buf.getFriendlyByteBuf()); ++ case ClientboundRespawn -> nmsPacket = new ClientboundRespawnPacket(buf.getFriendlyByteBuf()); ++ case ClientboundRotateHead -> nmsPacket = new ClientboundRotateHeadPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSectionBlocksUpdate -> nmsPacket = new ClientboundSectionBlocksUpdatePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSelectAdvancementsTab -> nmsPacket = new ClientboundSelectAdvancementsTabPacket(buf.getFriendlyByteBuf()); ++ case ClientboundServerData -> nmsPacket = new ClientboundServerDataPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetActionBarText -> nmsPacket = new ClientboundSetActionBarTextPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetBorderCenter -> nmsPacket = new ClientboundSetBorderCenterPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetBorderLerpSize -> nmsPacket = new ClientboundSetBorderLerpSizePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetBorderSize -> nmsPacket = new ClientboundSetBorderSizePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetBorderWarningDelay -> nmsPacket = new ClientboundSetBorderWarningDelayPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetBorderWarningDistance -> nmsPacket = new ClientboundSetBorderWarningDistancePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetCamera -> nmsPacket = new ClientboundSetCameraPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetCarriedItem -> nmsPacket = new ClientboundSetCarriedItemPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetChunkCacheCenter -> nmsPacket = new ClientboundSetChunkCacheCenterPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetChunkCacheRadius -> nmsPacket = new ClientboundSetChunkCacheRadiusPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetDefaultSpawnPosition -> nmsPacket = new ClientboundSetDefaultSpawnPositionPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetDisplayObjective -> nmsPacket = new ClientboundSetDisplayObjectivePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetEntityData -> nmsPacket = new ClientboundSetEntityDataPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetEntityLink -> nmsPacket = new ClientboundSetEntityLinkPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetEntityMotion -> nmsPacket = new ClientboundSetEntityMotionPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetEquipment -> nmsPacket = new ClientboundSetEquipmentPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetExperience -> nmsPacket = new ClientboundSetExperiencePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetHealth -> nmsPacket = new ClientboundSetHealthPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetObjective -> nmsPacket = new ClientboundSetObjectivePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetPassengers -> nmsPacket = new ClientboundSetPassengersPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetPlayerTeam -> nmsPacket = new ClientboundSetPlayerTeamPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetScore -> nmsPacket = new ClientboundSetScorePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetSimulationDistance -> nmsPacket = new ClientboundSetSimulationDistancePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetSubtitleText -> nmsPacket = new ClientboundSetSubtitleTextPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetTime -> nmsPacket = new ClientboundSetTimePacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetTitlesAnimation -> nmsPacket = new ClientboundSetTitlesAnimationPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSetTitleText -> nmsPacket = new ClientboundSetTitleTextPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSoundEntity -> nmsPacket = new ClientboundSoundEntityPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSound -> nmsPacket = new ClientboundSoundPacket(buf.getFriendlyByteBuf()); ++ case ClientboundStartConfiguration -> nmsPacket = new ClientboundStartConfigurationPacket(buf.getFriendlyByteBuf()); ++ case ClientboundStopSound -> nmsPacket = new ClientboundStopSoundPacket(buf.getFriendlyByteBuf()); ++ case ClientboundSystemChat -> nmsPacket = new ClientboundSystemChatPacket(buf.getFriendlyByteBuf()); ++ case ClientboundTabList -> nmsPacket = new ClientboundTabListPacket(buf.getFriendlyByteBuf()); ++ case ClientboundTagQuery -> nmsPacket = new ClientboundTagQueryPacket(buf.getFriendlyByteBuf()); ++ case ClientboundTakeItemEntity -> nmsPacket = new ClientboundTakeItemEntityPacket(buf.getFriendlyByteBuf()); ++ case ClientboundTeleportEntity -> nmsPacket = new ClientboundTeleportEntityPacket(buf.getFriendlyByteBuf()); ++ case ClientboundTickingState -> nmsPacket = new ClientboundTickingStatePacket(buf.getFriendlyByteBuf()); ++ case ClientboundTickingStep -> nmsPacket = new ClientboundTickingStepPacket(buf.getFriendlyByteBuf()); ++ case ClientboundUpdateAdvancements -> nmsPacket = new ClientboundUpdateAdvancementsPacket(buf.getFriendlyByteBuf()); ++ case ClientboundUpdateAttributes -> nmsPacket = new ClientboundUpdateAttributesPacket(buf.getFriendlyByteBuf()); ++ case ClientboundUpdateMobEffect -> nmsPacket = new ClientboundUpdateMobEffectPacket(buf.getFriendlyByteBuf()); ++ case ClientboundUpdateRecipes -> nmsPacket = new ClientboundUpdateRecipesPacket(buf.getFriendlyByteBuf()); ++ ++ } ++ } catch (Exception e) { ++ throw new UnsupportedOperationException("This feature is not completely finished yet, packet type " + type + " is not supported temporary."); ++ } ++ } ++ @Override ++ public PacketType getType() { ++ return type; ++ } ++ ++ @Override ++ public Bytebuf getBytebuf() { ++ return wrappedBytebuf; ++ } ++ ++ public net.minecraft.network.protocol.Packet getNmsPacket() { ++ return nmsPacket; ++ } ++} +diff --git a/src/main/java/org/leavesmc/leaves/packet/bytebuf/WrappedBytebuf.java b/src/main/java/org/leavesmc/leaves/packet/bytebuf/WrappedBytebuf.java +new file mode 100644 +index 0000000000000000000000000000000000000000..7444fab5dba74abfcf7b33eb39ea51d53a283a15 +--- /dev/null ++++ b/src/main/java/org/leavesmc/leaves/packet/bytebuf/WrappedBytebuf.java +@@ -0,0 +1,114 @@ ++package org.leavesmc.leaves.packet.bytebuf; ++ ++import com.mojang.brigadier.exceptions.CommandSyntaxException; ++import io.netty.buffer.Unpooled; ++import net.minecraft.nbt.Tag; ++import net.minecraft.nbt.TagParser; ++import net.minecraft.network.FriendlyByteBuf; ++import net.minecraft.network.chat.Component; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.inventory.ItemStack; ++import org.leavesmc.leaves.packet.WrappedPacket; ++import org.leavesmc.leaves.packet.Packet; ++import org.leavesmc.leaves.packet.PacketType; ++ ++import java.util.UUID; ++ ++public class WrappedBytebuf implements Bytebuf { ++ private final FriendlyByteBuf friendlyByteBuf; ++ public WrappedBytebuf() { ++ this(256); ++ } ++ public WrappedBytebuf(int initialCapacity) { ++ friendlyByteBuf = new FriendlyByteBuf(Unpooled.buffer(initialCapacity)); ++ } ++ ++ @Override ++ public Packet toPacket(PacketType type) { ++ return new WrappedPacket(type, this); ++ } ++ ++ @Override ++ public Bytebuf writeByte(int i) { ++ friendlyByteBuf.writeByte(i); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeBoolean(boolean flag) { ++ friendlyByteBuf.writeBoolean(flag); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeFloat(float f) { ++ friendlyByteBuf.writeFloat(f); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeInt(int i) { ++ friendlyByteBuf.writeInt(i); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeShort(int i) { ++ friendlyByteBuf.writeShort(i); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeLong(long i) { ++ friendlyByteBuf.writeLong(i); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeVarInt(int value) { ++ friendlyByteBuf.writeVarInt(value); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeUUID(UUID uuid) { ++ return null; ++ } ++ ++ @Override ++ public Bytebuf writeVarLong(long value) { ++ friendlyByteBuf.writeVarLong(value); ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeStringNbt(String nbt) { ++ try { ++ Tag tag = TagParser.parseTag(nbt); ++ friendlyByteBuf.writeNbt(tag); ++ } catch (CommandSyntaxException e) { ++ throw new IllegalArgumentException(e); ++ } ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeStringComponent(String component) { ++ try { ++ friendlyByteBuf.writeComponent(Component.Serializer.fromJson(component)); ++ } catch (Exception e) { ++ throw new IllegalArgumentException(e); ++ } ++ return this; ++ } ++ ++ @Override ++ public Bytebuf writeItem(ItemStack itemStack) { ++ friendlyByteBuf.writeItem(((CraftItemStack) itemStack).handle); ++ return this; ++ } ++ ++ public FriendlyByteBuf getFriendlyByteBuf() { ++ return friendlyByteBuf; ++ } ++}