From 75ea7ad9bb1beb52f5a4e610f3b56c9eeea6142e Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 3 Jan 2021 22:57:54 +0000 Subject: [PATCH 01/12] Only compile 1.16.4 --- CombatTagPlus/pom.xml | 72 +++++++++++++++++++++---------------------- pom.xml | 12 ++++---- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/CombatTagPlus/pom.xml b/CombatTagPlus/pom.xml index 3ad8e6e..c152937 100644 --- a/CombatTagPlus/pom.xml +++ b/CombatTagPlus/pom.xml @@ -74,36 +74,36 @@ 1.3.3-SNAPSHOT compile - - net.minelink - CombatTagPlusCompat-v1_12_R1 - 1.3.3-SNAPSHOT - compile - - - net.minelink - CombatTagPlusCompat-v1_13_R2 - 1.3.3-SNAPSHOT - compile - - - net.minelink - CombatTagPlusCompat-v1_14_R1 - 1.3.3-SNAPSHOT - compile - - - net.minelink - CombatTagPlusCompat-v1_15_R1 - 1.3.3-SNAPSHOT - compile - - - net.minelink - CombatTagPlusCompat-v1_16_R1 - 1.3.3-SNAPSHOT - compile - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + net.minelink CombatTagPlusCompat-v1_16_R3 @@ -116,12 +116,12 @@ 1.3.3-SNAPSHOT compile - - net.minelink - CombatTagPlusFactions-v2_7 - 1.3.3-SNAPSHOT - compile - + + + + + + net.minelink CombatTagPlusWG-v7 diff --git a/pom.xml b/pom.xml index 6190a10..47d0ae7 100644 --- a/pom.xml +++ b/pom.xml @@ -24,14 +24,14 @@ CombatTagPlusCompat-API - CombatTagPlusCompat-v1_12_R1 - CombatTagPlusCompat-v1_13_R2 - CombatTagPlusCompat-v1_14_R1 - CombatTagPlusCompat-v1_15_R1 - CombatTagPlusCompat-v1_16_R1 + + + + + CombatTagPlusCompat-v1_16_R3 CombatTagPlusHook - CombatTagPlusFactions-v2_7 + CombatTagPlusWG-v7 CombatTagPlus From 653c79706e04963b63e53261d808d82834f74edc Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 25 Apr 2021 12:39:45 +0100 Subject: [PATCH 02/12] Update repo to https --- CombatTagPlusWG-v7/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CombatTagPlusWG-v7/pom.xml b/CombatTagPlusWG-v7/pom.xml index d7ca790..3f96a30 100644 --- a/CombatTagPlusWG-v7/pom.xml +++ b/CombatTagPlusWG-v7/pom.xml @@ -18,7 +18,7 @@ sk89q-repo - http://maven.sk89q.com/repo + https://maven.sk89q.com/repo From 3942d4932bb56517de4440e61ab4ccfb47f7e123 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 25 Apr 2021 12:43:07 +0100 Subject: [PATCH 03/12] Update byteflux repo to https --- CombatTagPlus/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CombatTagPlus/pom.xml b/CombatTagPlus/pom.xml index c152937..2b5fe12 100644 --- a/CombatTagPlus/pom.xml +++ b/CombatTagPlus/pom.xml @@ -53,7 +53,7 @@ byteflux-repo - http://repo.byteflux.net/repository/maven-public/ + https://repo.byteflux.net/repository/maven-public/ spigot-repo From c14ff9be749fdeb8ea3a38805642600f54db2837 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 26 May 2021 00:35:06 +0100 Subject: [PATCH 04/12] Update to 1.16.5 --- CombatTagPlusCompat-v1_16_R3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 CombatTagPlusCompat-v1_16_R3/pom.xml diff --git a/CombatTagPlusCompat-v1_16_R3/pom.xml b/CombatTagPlusCompat-v1_16_R3/pom.xml old mode 100644 new mode 100755 index 413fdc9..0332b31 --- a/CombatTagPlusCompat-v1_16_R3/pom.xml +++ b/CombatTagPlusCompat-v1_16_R3/pom.xml @@ -15,7 +15,7 @@ com.destroystokyo.paper paper - 1.16.4-R0.1-SNAPSHOT + 1.16.5-R0.1-SNAPSHOT provided From 2d990b39616332debfff241609b3a1b4075d9519 Mon Sep 17 00:00:00 2001 From: Cola Date: Thu, 1 Jul 2021 13:47:38 +0100 Subject: [PATCH 05/12] v1.4.0 - Java 16 & 1.17 --- CombatTagPlus/pom.xml | 16 +- CombatTagPlus/src/main/resources/plugin.yml | 2 +- CombatTagPlusCompat-API/pom.xml | 2 +- CombatTagPlusCompat-v1_17_R1/pom.xml | 28 +++ .../compat/v1_17_R1/NpcNetworkManager.java | 88 ++++++++ .../ctplus/compat/v1_17_R1/NpcPlayer.java | 45 ++++ .../compat/v1_17_R1/NpcPlayerConnection.java | 168 +++++++++++++++ .../compat/v1_17_R1/NpcPlayerHelperImpl.java | 201 ++++++++++++++++++ pom.xml | 9 +- 9 files changed, 545 insertions(+), 14 deletions(-) create mode 100644 CombatTagPlusCompat-v1_17_R1/pom.xml create mode 100644 CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java create mode 100644 CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayer.java create mode 100644 CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerConnection.java create mode 100644 CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java diff --git a/CombatTagPlus/pom.xml b/CombatTagPlus/pom.xml index 2b5fe12..8022b7b 100644 --- a/CombatTagPlus/pom.xml +++ b/CombatTagPlus/pom.xml @@ -5,15 +5,15 @@ CombatTagPlusParent net.minelink - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT 4.0.0 CombatTagPlus - 1.8 - 1.8 + 16 + 16 @@ -28,7 +28,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.1 + 3.3.0-SNAPSHOT false @@ -63,15 +63,15 @@ - org.spigotmc - spigot - 1.16.1-R0.1-SNAPSHOT + io.papermc.paper + paper + 1.17-R0.1-SNAPSHOT provided net.minelink CombatTagPlusCompat-API - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT compile diff --git a/CombatTagPlus/src/main/resources/plugin.yml b/CombatTagPlus/src/main/resources/plugin.yml index 289f555..e1d7ccf 100644 --- a/CombatTagPlus/src/main/resources/plugin.yml +++ b/CombatTagPlus/src/main/resources/plugin.yml @@ -4,7 +4,7 @@ version: ${version} authors: [Byteflux, Sudzzy] main: net.minelink.ctplus.CombatTagPlus softdepend: [BarAPI, PlayerHeads, WorldGuard, Factions, Towny, BossBarAPI, ActionBarAPI, mcMMO] -api-version: 1.14 +api-version: 1.17 commands: combattagplus: aliases: [ctplus, ct, combattag] diff --git a/CombatTagPlusCompat-API/pom.xml b/CombatTagPlusCompat-API/pom.xml index 07d66fa..b9e02fb 100644 --- a/CombatTagPlusCompat-API/pom.xml +++ b/CombatTagPlusCompat-API/pom.xml @@ -5,7 +5,7 @@ CombatTagPlusParent net.minelink - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT 4.0.0 diff --git a/CombatTagPlusCompat-v1_17_R1/pom.xml b/CombatTagPlusCompat-v1_17_R1/pom.xml new file mode 100644 index 0000000..be5897f --- /dev/null +++ b/CombatTagPlusCompat-v1_17_R1/pom.xml @@ -0,0 +1,28 @@ + + + + CombatTagPlusParent + net.minelink + 1.4.0-SNAPSHOT + + 4.0.0 + + CombatTagPlusCompat-v1_17_R1 + + + + io.papermc.paper + paper + 1.17-R0.1-SNAPSHOT + provided + + + net.minelink + CombatTagPlusCompat-API + 1.4.0-SNAPSHOT + provided + + + diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java new file mode 100644 index 0000000..645cf91 --- /dev/null +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java @@ -0,0 +1,88 @@ +package net.minelink.ctplus.compat.v1_17_R1; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.util.concurrent.GenericFutureListener; +import java.net.SocketAddress; +import net.minecraft.network.EnumProtocol; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.PacketListener; +import net.minecraft.network.protocol.EnumProtocolDirection; +import net.minecraft.network.protocol.Packet; + +public final class NpcNetworkManager extends NetworkManager { + + public NpcNetworkManager() { + super(EnumProtocolDirection.a); + } + + @Override + public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception { + + } + + @Override + public void setProtocol(EnumProtocol enumprotocol) { + + } + + @Override + public void channelInactive(ChannelHandlerContext channelhandlercontext) { + + } + + @Override + public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) { + + } + + @Override + protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet packet) { + + } + + @Override + public void setPacketListener(PacketListener packetlistener) { + + } + + @Override + public void sendPacket(Packet packet) { + + } + + @Override + public void sendPacket(Packet packet, GenericFutureListener genericfuturelistener) { + + } + + @Override + public SocketAddress getSocketAddress() { + return new SocketAddress() {}; + } + + @Override + public boolean isLocal() { + return false; + } + + @Override + public boolean isConnected() { + return true; + } + + @Override + public void stopReading() { + + } + + @Override + public void setCompressionLevel(int i) { + + } + + @Override + public void handleDisconnection() { + + } + +} diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayer.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayer.java new file mode 100644 index 0000000..b4f40af --- /dev/null +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayer.java @@ -0,0 +1,45 @@ +package net.minelink.ctplus.compat.v1_17_R1; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import java.util.Map; +import java.util.UUID; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.EntityPlayer; +import net.minecraft.server.level.WorldServer; +import net.minelink.ctplus.compat.api.NpcIdentity; +import net.minelink.ctplus.compat.api.NpcNameGeneratorFactory; +import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public final class NpcPlayer extends EntityPlayer { + + private NpcIdentity identity; + + private NpcPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile) { + super(minecraftserver, worldserver, gameprofile); + } + + public NpcIdentity getNpcIdentity() { + return identity; + } + + public static NpcPlayer valueOf(Player player) { + MinecraftServer minecraftServer = MinecraftServer.getServer(); + WorldServer worldServer = ((CraftWorld) player.getWorld()).getHandle(); + GameProfile gameProfile = new GameProfile(UUID.randomUUID(), NpcNameGeneratorFactory.getNameGenerator().generate(player)); + + for (Map.Entry entry: ((CraftPlayer) player).getProfile().getProperties().entries()) { + gameProfile.getProperties().put(entry.getKey(), entry.getValue()); + } + + NpcPlayer npcPlayer = new NpcPlayer(minecraftServer, worldServer, gameProfile); + npcPlayer.identity = new NpcIdentity(player); + + new NpcPlayerConnection(npcPlayer); + + return npcPlayer; + } + +} diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerConnection.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerConnection.java new file mode 100644 index 0000000..f5db7f0 --- /dev/null +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerConnection.java @@ -0,0 +1,168 @@ +package net.minelink.ctplus.compat.v1_17_R1; + + +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.PacketPlayInAbilities; +import net.minecraft.network.protocol.game.PacketPlayInArmAnimation; +import net.minecraft.network.protocol.game.PacketPlayInBlockDig; +import net.minecraft.network.protocol.game.PacketPlayInBlockPlace; +import net.minecraft.network.protocol.game.PacketPlayInChat; +import net.minecraft.network.protocol.game.PacketPlayInClientCommand; +import net.minecraft.network.protocol.game.PacketPlayInCloseWindow; +import net.minecraft.network.protocol.game.PacketPlayInCustomPayload; +import net.minecraft.network.protocol.game.PacketPlayInEnchantItem; +import net.minecraft.network.protocol.game.PacketPlayInEntityAction; +import net.minecraft.network.protocol.game.PacketPlayInFlying; +import net.minecraft.network.protocol.game.PacketPlayInHeldItemSlot; +import net.minecraft.network.protocol.game.PacketPlayInKeepAlive; +import net.minecraft.network.protocol.game.PacketPlayInResourcePackStatus; +import net.minecraft.network.protocol.game.PacketPlayInSetCreativeSlot; +import net.minecraft.network.protocol.game.PacketPlayInSettings; +import net.minecraft.network.protocol.game.PacketPlayInSpectate; +import net.minecraft.network.protocol.game.PacketPlayInSteerVehicle; +import net.minecraft.network.protocol.game.PacketPlayInTabComplete; +import net.minecraft.network.protocol.game.PacketPlayInUpdateSign; +import net.minecraft.network.protocol.game.PacketPlayInUseEntity; +import net.minecraft.network.protocol.game.PacketPlayInWindowClick; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.EntityPlayer; +import net.minecraft.server.network.PlayerConnection; + +public final class NpcPlayerConnection extends PlayerConnection { + + public NpcPlayerConnection(EntityPlayer entityplayer) { + super(MinecraftServer.getServer(), new NpcNetworkManager(), entityplayer); + } + + @Override + public void disconnect(String s) { + + } + + @Override + public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) { + + } + + @Override + public void a(PacketPlayInFlying packetplayinflying) { + + } + + @Override + public void a(PacketPlayInBlockDig packetplayinblockdig) { + + } + + @Override + public void a(PacketPlayInBlockPlace packetplayinblockplace) { + + } + + @Override + public void a(PacketPlayInSpectate packetplayinspectate) { + + } + + @Override + public void a(PacketPlayInResourcePackStatus packetplayinresourcepackstatus) { + + } + + @Override + public void a(IChatBaseComponent ichatbasecomponent) { + + } + + @Override + public void sendPacket(Packet packet) { + + } + + @Override + public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) { + + } + + @Override + public void a(PacketPlayInChat packetplayinchat) { + + } + + @Override + public void chat(String s, boolean async) { + + } + + @Override + public void a(PacketPlayInArmAnimation packetplayinarmanimation) { + + } + + @Override + public void a(PacketPlayInEntityAction packetplayinentityaction) { + + } + + @Override + public void a(PacketPlayInUseEntity packetplayinuseentity) { + + } + + @Override + public void a(PacketPlayInClientCommand packetplayinclientcommand) { + + } + + @Override + public void a(PacketPlayInCloseWindow packetplayinclosewindow) { + + } + + @Override + public void a(PacketPlayInWindowClick packetplayinwindowclick) { + + } + + @Override + public void a(PacketPlayInEnchantItem packetplayinenchantitem) { + + } + + @Override + public void a(PacketPlayInSetCreativeSlot packetplayinsetcreativeslot) { + + } + + @Override + public void a(PacketPlayInUpdateSign packetplayinupdatesign) { + + } + + @Override + public void a(PacketPlayInKeepAlive packetplayinkeepalive) { + + } + + @Override + public void a(PacketPlayInAbilities packetplayinabilities) { + + } + + @Override + public void a(PacketPlayInTabComplete packetplayintabcomplete) { + + } + + @Override + public void a(PacketPlayInSettings packetplayinsettings) { + + } + + @Override + public void a(PacketPlayInCustomPayload packetplayincustompayload) { + + } + +} diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java new file mode 100644 index 0000000..836b2c3 --- /dev/null +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java @@ -0,0 +1,201 @@ +package net.minelink.ctplus.compat.v1_17_R1; + +import com.google.common.collect.Lists; +import com.mojang.datafixers.util.Pair; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.List; +import net.minecraft.nbt.NBTCompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.PacketPlayOutEntityEquipment; +import net.minecraft.network.protocol.game.PacketPlayOutPlayerInfo; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.EntityPlayer; +import net.minecraft.server.level.WorldServer; +import net.minecraft.world.entity.EnumItemSlot; +import net.minecraft.world.food.FoodMetaData; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.WorldNBTStorage; +import net.minelink.ctplus.compat.api.NpcIdentity; +import net.minelink.ctplus.compat.api.NpcPlayerHelper; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public final class NpcPlayerHelperImpl implements NpcPlayerHelper { + + @Override + public Player spawn(Player player) { + NpcPlayer npcPlayer = NpcPlayer.valueOf(player); + WorldServer worldServer = ((CraftWorld) player.getWorld()).getHandle(); + Location l = player.getLocation(); + + npcPlayer.spawnIn(worldServer); + npcPlayer.setPositionRotation(l.getX(), l.getY(), l.getZ(), l.getYaw(), l.getPitch()); + npcPlayer.d.a(worldServer); + npcPlayer.cD = 0; + + for (Object o : MinecraftServer.getServer().getPlayerList().getPlayers()) { + if (!(o instanceof EntityPlayer) || o instanceof NpcPlayer) continue; + + PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npcPlayer); + ((EntityPlayer) o).b.sendPacket(packet); + } + + worldServer.addEntity(npcPlayer); + + return npcPlayer.getBukkitEntity(); + } + + @Override + public void despawn(Player player) { + EntityPlayer entity = ((CraftPlayer) player).getHandle(); + + if (!(entity instanceof NpcPlayer)) { + throw new IllegalArgumentException(); + } + + for (Object o : MinecraftServer.getServer().getPlayerList().getPlayers()) { + if (!(o instanceof EntityPlayer) || o instanceof NpcPlayer) continue; + + PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, entity); + ((EntityPlayer) o).b.sendPacket(packet); + } + + WorldServer worldServer = MinecraftServer.getServer().getWorldServer(entity.getWorld().getDimensionKey()); + worldServer.getChunkProvider().removeEntity(entity); + } + + @Override + public boolean isNpc(Player player) { + return ((CraftPlayer) player).getHandle() instanceof NpcPlayer; + } + + @Override + public NpcIdentity getIdentity(Player player) { + if (!isNpc(player)) { + throw new IllegalArgumentException(); + } + + return ((NpcPlayer) ((CraftPlayer) player).getHandle()).getNpcIdentity(); + } + + @Override + public void updateEquipment(Player player) { + EntityPlayer entity = ((CraftPlayer) player).getHandle(); + + if (!(entity instanceof NpcPlayer)) { + throw new IllegalArgumentException(); + } + + for (EnumItemSlot slot : EnumItemSlot.values()) { + ItemStack item = entity.getEquipment(slot); + if (item == null) continue; + + // Set the attribute for this equipment to consider armor values and enchantments + // Actually getAttributeMap().a() is used with the previous item, to clear the Attributes + entity.getAttributeMap().a(item.a(slot)); + entity.getAttributeMap().b(item.a(slot)); + + // This is also called by super.tick(), but the flag this.bx is not public + List> list = Lists.newArrayList(); + list.add(Pair.of(slot, item)); + Packet packet = new PacketPlayOutEntityEquipment(entity.getId(), list); + entity.getWorldServer().getChunkProvider().broadcast(entity, packet); + } + } + + @Override + public void syncOffline(Player player) { + EntityPlayer entity = ((CraftPlayer) player).getHandle(); + + if (!(entity instanceof NpcPlayer)) { + throw new IllegalArgumentException(); + } + + NpcPlayer npcPlayer = (NpcPlayer) entity; + NpcIdentity identity = npcPlayer.getNpcIdentity(); + Player p = Bukkit.getPlayer(identity.getId()); + if (p != null && p.isOnline()) return; + + WorldNBTStorage worldStorage = (WorldNBTStorage) ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle().getMinecraftServer().k; + NBTTagCompound playerNbt = worldStorage.getPlayerData(identity.getId().toString()); + if (playerNbt == null) return; + + // foodTickTimer is now private in 1.8.3 -- still private in 1.12 + Field foodTickTimerField; + int foodTickTimer; + + try { + foodTickTimerField = FoodMetaData.class.getDeclaredField("foodTickTimer"); + foodTickTimerField.setAccessible(true); + foodTickTimer = foodTickTimerField.getInt(entity.getFoodData()); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + + playerNbt.setShort("Air", (short) entity.getAirTicks()); + // Health is now just a float; fractional is not stored separately. (1.12) + playerNbt.setFloat("Health", entity.getHealth()); + playerNbt.setFloat("AbsorptionAmount", entity.getAbsorptionHearts()); + playerNbt.setInt("XpTotal", entity.cj); + playerNbt.setInt("foodLevel", entity.getFoodData().getFoodLevel()); + playerNbt.setInt("foodTickTimer", foodTickTimer); + playerNbt.setFloat("foodSaturationLevel", entity.getFoodData().getSaturationLevel()); + playerNbt.setFloat("foodExhaustionLevel", entity.getFoodData().d()); + playerNbt.setShort("Fire", (short) entity.getFireTicks()); + playerNbt.set("Inventory", npcPlayer.getInventory().a(new NBTTagList())); + + File file1 = new File(worldStorage.getPlayerDir(), identity.getId().toString() + ".dat.tmp"); + File file2 = new File(worldStorage.getPlayerDir(), identity.getId().toString() + ".dat"); + + try { + NBTCompressedStreamTools.a(playerNbt, new FileOutputStream(file1)); + } catch (IOException e) { + throw new RuntimeException("Failed to save player data for " + identity.getName(), e); + } + + if ((!file2.exists() || file2.delete()) && !file1.renameTo(file2)) { + throw new RuntimeException("Failed to save player data for " + identity.getName()); + } + } + + @Override + public void createPlayerList(Player player) { + EntityPlayer p = ((CraftPlayer) player).getHandle(); + + for (WorldServer worldServer : MinecraftServer.getServer().getWorlds()) { + for (Object o : worldServer.getPlayers()) { + if (!(o instanceof NpcPlayer)) continue; + + NpcPlayer npcPlayer = (NpcPlayer) o; + PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo( + PacketPlayOutPlayerInfo.EnumPlayerInfoAction.a, npcPlayer); + p.b.sendPacket(packet); + } + } + } + + @Override + public void removePlayerList(Player player) { + EntityPlayer p = ((CraftPlayer) player).getHandle(); + + for (WorldServer worldServer : MinecraftServer.getServer().getWorlds()) { + for (Object o : worldServer.getPlayers()) { + if (!(o instanceof NpcPlayer)) continue; + + NpcPlayer npcPlayer = (NpcPlayer) o; + PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo( + PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npcPlayer); + p.b.sendPacket(packet); + } + } + } + +} diff --git a/pom.xml b/pom.xml index 47d0ae7..1ca5598 100644 --- a/pom.xml +++ b/pom.xml @@ -13,13 +13,13 @@ net.minelink CombatTagPlusParent pom - 1.3.3-SNAPSHOT + 1.4.0-SNAPSHOT UTF-8 UTF-8 - 1.8 - 1.8 + 16 + 16 @@ -29,7 +29,8 @@ - CombatTagPlusCompat-v1_16_R3 + + CombatTagPlusCompat-v1_17_R1 CombatTagPlusHook CombatTagPlusWG-v7 From 1c03dec0f233f9672d45e5611ffd3b7e8c96d09f Mon Sep 17 00:00:00 2001 From: Cola Date: Fri, 2 Jul 2021 00:35:33 +0100 Subject: [PATCH 06/12] Fixes --- .../java/net/minelink/ctplus/listener/NpcListener.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java b/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java index 0f700d7..ed72361 100644 --- a/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java +++ b/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java @@ -63,14 +63,7 @@ public void despawnNpc(PlayerDeathEvent event) { // NPC died, remove player's combat tag plugin.getTagManager().untag(id); - - // Despawn NPC on the next tick - Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { - @Override - public void run() { - plugin.getNpcManager().despawn(npc, NpcDespawnReason.DEATH); - } - }); + plugin.getNpcManager().despawn(npc, NpcDespawnReason.DEATH); } @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) From 8d789ba72030e9501918b7bc6c2b67c512b5f0e8 Mon Sep 17 00:00:00 2001 From: Cola Date: Fri, 2 Jul 2021 15:01:44 +0100 Subject: [PATCH 07/12] Fix pom --- CombatTagPlus/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CombatTagPlus/pom.xml b/CombatTagPlus/pom.xml index 8022b7b..8f68d92 100644 --- a/CombatTagPlus/pom.xml +++ b/CombatTagPlus/pom.xml @@ -106,8 +106,8 @@ net.minelink - CombatTagPlusCompat-v1_16_R3 - 1.3.3-SNAPSHOT + CombatTagPlusCompat-v1_17_R1 + 1.4.0-SNAPSHOT compile From e61573818320abfd13924a29a57e4406a4fffa89 Mon Sep 17 00:00:00 2001 From: Cola Date: Fri, 2 Jul 2021 15:01:53 +0100 Subject: [PATCH 08/12] Revert "Merge branch 'ctfixes' into 16+17" This reverts commit 5c801c5841084f946ced9fef24f0c7776c003d9d. --- .../java/net/minelink/ctplus/listener/NpcListener.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java b/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java index ed72361..0f700d7 100644 --- a/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java +++ b/CombatTagPlus/src/main/java/net/minelink/ctplus/listener/NpcListener.java @@ -63,7 +63,14 @@ public void despawnNpc(PlayerDeathEvent event) { // NPC died, remove player's combat tag plugin.getTagManager().untag(id); - plugin.getNpcManager().despawn(npc, NpcDespawnReason.DEATH); + + // Despawn NPC on the next tick + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { + @Override + public void run() { + plugin.getNpcManager().despawn(npc, NpcDespawnReason.DEATH); + } + }); } @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL) From 1c3a2d1101c353c3caf446c302859e888c44e7a4 Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 6 Jul 2021 13:59:06 +0100 Subject: [PATCH 09/12] Fix foodTickTimer field --- .../minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java index 836b2c3..8daaa98 100644 --- a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java @@ -133,7 +133,7 @@ public void syncOffline(Player player) { int foodTickTimer; try { - foodTickTimerField = FoodMetaData.class.getDeclaredField("foodTickTimer"); + foodTickTimerField = FoodMetaData.class.getDeclaredField("d"); foodTickTimerField.setAccessible(true); foodTickTimer = foodTickTimerField.getInt(entity.getFoodData()); } catch (NoSuchFieldException | IllegalAccessException e) { From 987e09160773c3cd208035c2860d9b6b1596c87f Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 13 Jul 2021 17:35:23 +0100 Subject: [PATCH 10/12] Fix tab bug --- .../compat/v1_17_R1/NpcPlayerHelperImpl.java | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java index 8daaa98..5b10f62 100644 --- a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java @@ -56,20 +56,10 @@ public Player spawn(Player player) { @Override public void despawn(Player player) { EntityPlayer entity = ((CraftPlayer) player).getHandle(); - if (!(entity instanceof NpcPlayer)) { throw new IllegalArgumentException(); } - - for (Object o : MinecraftServer.getServer().getPlayerList().getPlayers()) { - if (!(o instanceof EntityPlayer) || o instanceof NpcPlayer) continue; - - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, entity); - ((EntityPlayer) o).b.sendPacket(packet); - } - - WorldServer worldServer = MinecraftServer.getServer().getWorldServer(entity.getWorld().getDimensionKey()); - worldServer.getChunkProvider().removeEntity(entity); + removePlayerList(player); } @Override @@ -191,10 +181,11 @@ public void removePlayerList(Player player) { if (!(o instanceof NpcPlayer)) continue; NpcPlayer npcPlayer = (NpcPlayer) o; - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo( - PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npcPlayer); + PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npcPlayer); p.b.sendPacket(packet); } + worldServer.getPlayers().removeIf(npc -> npc.getName().equals(p.getName())); + worldServer.getChunkProvider().removeEntity(p); } } From 53a22cd3677f7db07d3285ea0046585d63b76fa3 Mon Sep 17 00:00:00 2001 From: Cola Date: Mon, 19 Jul 2021 12:58:38 +0100 Subject: [PATCH 11/12] 1.17.1 --- CombatTagPlus/pom.xml | 2 +- CombatTagPlusCompat-v1_17_R1/pom.xml | 2 +- .../minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java | 5 ----- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/CombatTagPlus/pom.xml b/CombatTagPlus/pom.xml index 8f68d92..f3ebf9b 100644 --- a/CombatTagPlus/pom.xml +++ b/CombatTagPlus/pom.xml @@ -65,7 +65,7 @@ io.papermc.paper paper - 1.17-R0.1-SNAPSHOT + 1.17.1-R0.1-SNAPSHOT provided diff --git a/CombatTagPlusCompat-v1_17_R1/pom.xml b/CombatTagPlusCompat-v1_17_R1/pom.xml index be5897f..cab1c37 100644 --- a/CombatTagPlusCompat-v1_17_R1/pom.xml +++ b/CombatTagPlusCompat-v1_17_R1/pom.xml @@ -15,7 +15,7 @@ io.papermc.paper paper - 1.17-R0.1-SNAPSHOT + 1.17.1-R0.1-SNAPSHOT provided diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java index 645cf91..0e33f17 100644 --- a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcNetworkManager.java @@ -75,11 +75,6 @@ public void stopReading() { } - @Override - public void setCompressionLevel(int i) { - - } - @Override public void handleDisconnection() { From 1fcf006ed4bada2cb0297293cc3d5ccc73808272 Mon Sep 17 00:00:00 2001 From: Cola Date: Mon, 2 Aug 2021 01:36:25 +0100 Subject: [PATCH 12/12] Maybe finally properly fix Playerlist issue? --- .../ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java index 5b10f62..d0ee99e 100644 --- a/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java +++ b/CombatTagPlusCompat-v1_17_R1/src/main/java/net/minelink/ctplus/compat/v1_17_R1/NpcPlayerHelperImpl.java @@ -59,6 +59,17 @@ public void despawn(Player player) { if (!(entity instanceof NpcPlayer)) { throw new IllegalArgumentException(); } + + for (Object o : MinecraftServer.getServer().getPlayerList().getPlayers()) { + if (!(o instanceof EntityPlayer) || o instanceof NpcPlayer) continue; + + PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, entity); + ((EntityPlayer) o).b.sendPacket(packet); + } + + WorldServer worldServer = MinecraftServer.getServer().getWorldServer(entity.getWorld().getDimensionKey()); + worldServer.getChunkProvider().removeEntity(entity); + worldServer.getPlayers().remove(entity); removePlayerList(player); } @@ -184,8 +195,6 @@ public void removePlayerList(Player player) { PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.e, npcPlayer); p.b.sendPacket(packet); } - worldServer.getPlayers().removeIf(npc -> npc.getName().equals(p.getName())); - worldServer.getChunkProvider().removeEntity(p); } }