From 87b893b950b388a851173b146c3d6a90d513709a Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Sun, 5 May 2024 13:10:20 -0500 Subject: [PATCH] feat: 1.20.6 tomfuckery support --- build.gradle.kts | 28 ++-- .../hibiscuscommons/nms/NMSHandlers.java | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 3 +- v1_18_R2/build.gradle.kts | 2 +- v1_19_R2/build.gradle.kts | 2 +- v1_19_R3/build.gradle.kts | 2 +- v1_20_R1/build.gradle.kts | 2 +- v1_20_R2/build.gradle.kts | 2 +- v1_20_R3/build.gradle.kts | 2 +- v1_20_R4/build.gradle.kts | 30 ++++ .../nms/v1_20_R4/NMSHandler.java | 153 ++++++++++++++++++ 12 files changed, 208 insertions(+), 22 deletions(-) create mode 100644 v1_20_R4/build.gradle.kts create mode 100644 v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSHandler.java diff --git a/build.gradle.kts b/build.gradle.kts index 7a93681..91d746e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,12 +1,13 @@ import net.minecrell.pluginyml.bukkit.BukkitPluginDescription -import io.papermc.hangarpublishplugin.model.Platforms plugins { id("java") id("maven-publish") - id("com.github.johnrengelman.shadow") version "8.1.1" + id("io.github.goooler.shadow") version "8.1.7" // Temp shadow repo with fix + //id("com.github.johnrengelman.shadow") version "8.1.1" id("net.minecrell.plugin-yml.bukkit") version "0.6.0" - id("io.papermc.hangar-publish-plugin") version "0.1.1" + //id("io.papermc.hangar-publish-plugin") version "0.1.1" + id("io.papermc.paperweight.userdev") version "1.7.0" apply false } group = "me.lojosho" @@ -84,9 +85,9 @@ allprojects { compileOnly("com.ticxo.modelengine:ModelEngine:R4.0.2") // Lombok <3 - annotationProcessor("org.projectlombok:lombok:1.18.28") - testCompileOnly("org.projectlombok:lombok:1.18.28") - testAnnotationProcessor("org.projectlombok:lombok:1.18.28") + annotationProcessor("org.projectlombok:lombok:1.18.32") + testCompileOnly("org.projectlombok:lombok:1.18.32") + testAnnotationProcessor("org.projectlombok:lombok:1.18.32") // Spigot Auto Loader Libraries compileOnly("net.kyori:adventure-api:4.15.0") @@ -110,12 +111,13 @@ dependencies { implementation(project(path = ":v1_20_R1", configuration = "reobf")) implementation(project(path = ":v1_20_R2", configuration = "reobf")) implementation(project(path = ":v1_20_R3", configuration = "reobf")) + implementation(project(path = ":v1_20_R4", configuration = "reobf")) } tasks { compileJava { options.encoding = Charsets.UTF_8.name() - options.release.set(17) + //options.release.set(17) } javadoc { @@ -134,6 +136,7 @@ tasks { dependsOn(":v1_20_R1:reobfJar") dependsOn(":v1_20_R2:reobfJar") dependsOn(":v1_20_R3:reobfJar") + dependsOn(":v1_20_R4:reobfJar") mergeServiceFiles() relocate("org.bstats", "me.lojosho.shaded.bstats") @@ -155,11 +158,10 @@ tasks { build { dependsOn(shadowJar) } -} -java { - toolchain.languageVersion.set(JavaLanguageVersion.of(17 - )) + java { + toolchain.languageVersion.set(JavaLanguageVersion.of(17)) + } } // Handles generating the plugin yml @@ -199,7 +201,7 @@ bukkit { //"org.spongepowered:configurate-yaml:4.2.0-SNAPSHOT" // Readd when 4.2.0 releases ) } - +/* hangarPublish { publications.register("plugin") { version.set(project.version as String) @@ -223,7 +225,7 @@ hangarPublish { } } } - +*/ // Publishing stuff below here to a remote maven repo publishing { diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java index 8ae6501..1667dc6 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSHandlers.java @@ -8,7 +8,7 @@ import java.lang.reflect.InvocationTargetException; public class NMSHandlers { - private static final String[] SUPPORTED_VERSION = new String[]{"v1_18_R2", "v1_19_R1", "v1_19_R2", "v1_19_R3", "v1_20_R1", "v1_20_R2", "v1_20_R3"}; + private static final String[] SUPPORTED_VERSION = new String[]{"v1_18_R2", "v1_19_R1", "v1_19_R2", "v1_19_R3", "v1_20_R1", "v1_20_R2", "v1_20_R3", "v1_20_R4"}; private static NMSHandler handler; @Getter private static String version; diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d..20db9ad 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index e7caca1..337a01a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,5 +13,6 @@ include( "v1_19_R3", "v1_20_R1", "v1_20_R2", - "v1_20_R3" + "v1_20_R3", + "v1_20_R4" ) \ No newline at end of file diff --git a/v1_18_R2/build.gradle.kts b/v1_18_R2/build.gradle.kts index 6d1c877..011814d 100644 --- a/v1_18_R2/build.gradle.kts +++ b/v1_18_R2/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("java") - id("io.papermc.paperweight.userdev") version "1.5.11" + id("io.papermc.paperweight.userdev") version "1.7.0" } dependencies { diff --git a/v1_19_R2/build.gradle.kts b/v1_19_R2/build.gradle.kts index fdb7a71..f045300 100644 --- a/v1_19_R2/build.gradle.kts +++ b/v1_19_R2/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("java") - id("io.papermc.paperweight.userdev") version "1.5.11" + id("io.papermc.paperweight.userdev") version "1.7.0" } dependencies { diff --git a/v1_19_R3/build.gradle.kts b/v1_19_R3/build.gradle.kts index 78f33b3..9690365 100644 --- a/v1_19_R3/build.gradle.kts +++ b/v1_19_R3/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("java") - id("io.papermc.paperweight.userdev") version "1.5.11" + id("io.papermc.paperweight.userdev") version "1.7.0" } dependencies { diff --git a/v1_20_R1/build.gradle.kts b/v1_20_R1/build.gradle.kts index d6abd49..8e941cf 100644 --- a/v1_20_R1/build.gradle.kts +++ b/v1_20_R1/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("java") - id("io.papermc.paperweight.userdev") version "1.5.11" + id("io.papermc.paperweight.userdev") version "1.7.0" } dependencies { diff --git a/v1_20_R2/build.gradle.kts b/v1_20_R2/build.gradle.kts index a62a31d..2790239 100644 --- a/v1_20_R2/build.gradle.kts +++ b/v1_20_R2/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("java") - id("io.papermc.paperweight.userdev") version "1.5.11" + id("io.papermc.paperweight.userdev") version "1.7.0" } dependencies { diff --git a/v1_20_R3/build.gradle.kts b/v1_20_R3/build.gradle.kts index 9b87104..d657071 100644 --- a/v1_20_R3/build.gradle.kts +++ b/v1_20_R3/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("java") - id("io.papermc.paperweight.userdev") version "1.5.11" + id("io.papermc.paperweight.userdev") version "1.7.0" } dependencies { diff --git a/v1_20_R4/build.gradle.kts b/v1_20_R4/build.gradle.kts new file mode 100644 index 0000000..dd8051d --- /dev/null +++ b/v1_20_R4/build.gradle.kts @@ -0,0 +1,30 @@ +plugins { + id("java") + id("io.papermc.paperweight.userdev") version "1.7.0" +} + +dependencies { + paperweight.paperDevBundle("1.20.6-R0.1-SNAPSHOT") + implementation(project(":common")) +} + +tasks { + + build { + dependsOn(reobfJar) + } + + compileJava { + options.encoding = Charsets.UTF_8.name() + } + java { + toolchain.languageVersion.set(JavaLanguageVersion.of(21)); + } + + javadoc { + options.encoding = Charsets.UTF_8.name() + } + processResources { + filteringCharset = Charsets.UTF_8.name() + } +} \ No newline at end of file diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSHandler.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSHandler.java new file mode 100644 index 0000000..1f15c21 --- /dev/null +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSHandler.java @@ -0,0 +1,153 @@ +package me.lojosho.hibiscuscommons.nms.v1_20_R4; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; +import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket; +import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerPlayerConnection; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.world.scores.Team; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.scoreboard.CraftScoreboard; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class NMSHandler implements me.lojosho.hibiscuscommons.nms.NMSHandler { + + + @Override + public int getNextEntityId() { + return net.minecraft.world.entity.Entity.nextEntityId(); + } + + @Override + public org.bukkit.entity.Entity getEntity(int entityId) { + net.minecraft.world.entity.Entity entity = getNMSEntity(entityId); + if (entity == null) return null; + return entity.getBukkitEntity(); + } + + private net.minecraft.world.entity.Entity getNMSEntity(int entityId) { + for (ServerLevel world : ((CraftServer) Bukkit.getServer()).getHandle().getServer().getAllLevels()) { + net.minecraft.world.entity.Entity entity = world.getEntity(entityId); + if (entity == null) continue; + return entity; + } + return null; + } + + @Override + public void equipmentSlotUpdate( + int entityId, + org.bukkit.inventory.EquipmentSlot slot, + ItemStack item, + List sendTo + ) { + + EquipmentSlot nmsSlot = null; + net.minecraft.world.item.ItemStack nmsItem = null; + + // Converting EquipmentSlot and ItemStack to NMS ones. + nmsSlot = CraftEquipmentSlot.getNMS(slot); + nmsItem = CraftItemStack.asNMSCopy(item); + + if (nmsSlot == null) return; + + Pair pair = new Pair<>(nmsSlot, nmsItem); + + List> pairs = Collections.singletonList(pair); + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void equipmentSlotUpdate( + int entityId, + HashMap equipment, + List sendTo + ) { + + List> pairs = new ArrayList<>(); + + for (org.bukkit.inventory.EquipmentSlot slot : equipment.keySet()) { + EquipmentSlot nmsSlot = CraftEquipmentSlot.getNMS(slot); + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(equipment.get(slot)); + + Pair pair = new Pair<>(nmsSlot, nmsItem); + pairs.add(pair); + } + + ClientboundSetEquipmentPacket packet = new ClientboundSetEquipmentPacket(entityId, pairs); + for (Player p : sendTo) sendPacket(p, packet); + } + + + @Override + public void slotUpdate( + Player player, + int slot + ) { + int index = 0; + + ServerPlayer player1 = ((CraftPlayer) player).getHandle(); + + if (index < Inventory.getSelectionSize()) { + index += 36; + } else if (index > 39) { + index += 5; // Off hand + } else if (index > 35) { + index = 8 - (index - 36); + } + ItemStack item = player.getInventory().getItem(slot); + + Packet packet = new ClientboundContainerSetSlotPacket(player1.inventoryMenu.containerId, player1.inventoryMenu.incrementStateId(), index, CraftItemStack.asNMSCopy(item)); + sendPacket(player, packet); + } + + @Override + public void hideNPCName(Player player, String NPCName) { + //Creating the team + PlayerTeam team = new PlayerTeam(((CraftScoreboard) Bukkit.getScoreboardManager().getMainScoreboard()).getHandle(), NPCName); + + //Setting name visibility + team.setNameTagVisibility(Team.Visibility.NEVER); + + //Remove the Team (i assume so if it exists) + ClientboundSetPlayerTeamPacket removeTeamPacket = ClientboundSetPlayerTeamPacket.createRemovePacket(team); + sendPacket(player, removeTeamPacket); + //Creating the Team + ClientboundSetPlayerTeamPacket createTeamPacket = ClientboundSetPlayerTeamPacket.createAddOrModifyPacket(team, true); + sendPacket(player, createTeamPacket); + //Adding players to the team (You have to use the NPC's name, and add it to a list) + ClientboundSetPlayerTeamPacket createPlayerTeamPacket = ClientboundSetPlayerTeamPacket.createMultiplePlayerPacket(team, new ArrayList() {{ + add(NPCName); + }}, ClientboundSetPlayerTeamPacket.Action.ADD); + sendPacket(player, createPlayerTeamPacket); + } + + public void sendPacket(Player player, Packet packet) { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + } + + @Override + public boolean getSupported() { + return true; + } +}