From 743e40c9ce4d828caa9c7c6c2efa417a92205e5e Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 25 Jul 2020 12:58:11 +0200 Subject: [PATCH] Fix BedrockEdition inability for Non-Full-Chunk packets --- .../src/de/steamwar/chunk/Chunk_10.java | 14 ++++ .../src/de/steamwar/chunk/Chunk_12.java | 14 ++++ .../src/de/steamwar/chunk/Chunk_14.java | 14 ++++ .../src/de/steamwar/chunk/Chunk_15.java | 14 ++++ .../src/de/steamwar/chunk/Chunk_8.java | 14 ++++ .../src/de/steamwar/chunk/Chunk_9.java | 14 ++++ SpigotCore_Main/pom.xml | 6 ++ .../src/de/steamwar/core/Core.java | 2 + .../steamwar/core/events/ChunkListener.java | 64 +++++++++++++++++++ .../src/de/steamwar/sql/SteamwarUser.java | 6 ++ SpigotCore_Main/src/plugin.yml | 2 + 11 files changed, 164 insertions(+) create mode 100644 SpigotCore_10/src/de/steamwar/chunk/Chunk_10.java create mode 100644 SpigotCore_12/src/de/steamwar/chunk/Chunk_12.java create mode 100644 SpigotCore_14/src/de/steamwar/chunk/Chunk_14.java create mode 100644 SpigotCore_15/src/de/steamwar/chunk/Chunk_15.java create mode 100644 SpigotCore_8/src/de/steamwar/chunk/Chunk_8.java create mode 100644 SpigotCore_9/src/de/steamwar/chunk/Chunk_9.java create mode 100644 SpigotCore_Main/src/de/steamwar/core/events/ChunkListener.java diff --git a/SpigotCore_10/src/de/steamwar/chunk/Chunk_10.java b/SpigotCore_10/src/de/steamwar/chunk/Chunk_10.java new file mode 100644 index 0000000..1a2925f --- /dev/null +++ b/SpigotCore_10/src/de/steamwar/chunk/Chunk_10.java @@ -0,0 +1,14 @@ +package de.steamwar.chunk; + +import net.minecraft.server.v1_10_R1.PacketPlayOutMapChunk; +import org.bukkit.craftbukkit.v1_10_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class Chunk_10 { + private Chunk_10(){} + + public static void sendChunk(Player p, int chunkX, int chunkZ){ + ((CraftPlayer)p).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk)p.getWorld().getChunkAt(chunkX, chunkZ)).getHandle(), 65535)); + } +} diff --git a/SpigotCore_12/src/de/steamwar/chunk/Chunk_12.java b/SpigotCore_12/src/de/steamwar/chunk/Chunk_12.java new file mode 100644 index 0000000..2b93f27 --- /dev/null +++ b/SpigotCore_12/src/de/steamwar/chunk/Chunk_12.java @@ -0,0 +1,14 @@ +package de.steamwar.chunk; + +import net.minecraft.server.v1_12_R1.PacketPlayOutMapChunk; +import org.bukkit.craftbukkit.v1_12_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class Chunk_12 { + private Chunk_12(){} + + public static void sendChunk(Player p, int chunkX, int chunkZ){ + ((CraftPlayer)p).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk)p.getWorld().getChunkAt(chunkX, chunkZ)).getHandle(), 65535)); + } +} diff --git a/SpigotCore_14/src/de/steamwar/chunk/Chunk_14.java b/SpigotCore_14/src/de/steamwar/chunk/Chunk_14.java new file mode 100644 index 0000000..a9740f2 --- /dev/null +++ b/SpigotCore_14/src/de/steamwar/chunk/Chunk_14.java @@ -0,0 +1,14 @@ +package de.steamwar.chunk; + +import net.minecraft.server.v1_14_R1.PacketPlayOutMapChunk; +import org.bukkit.craftbukkit.v1_14_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class Chunk_14 { + private Chunk_14(){} + + public static void sendChunk(Player p, int chunkX, int chunkZ){ + ((CraftPlayer)p).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk)p.getWorld().getChunkAt(chunkX, chunkZ)).getHandle(), 65535)); + } +} diff --git a/SpigotCore_15/src/de/steamwar/chunk/Chunk_15.java b/SpigotCore_15/src/de/steamwar/chunk/Chunk_15.java new file mode 100644 index 0000000..a01942d --- /dev/null +++ b/SpigotCore_15/src/de/steamwar/chunk/Chunk_15.java @@ -0,0 +1,14 @@ +package de.steamwar.chunk; + +import net.minecraft.server.v1_15_R1.PacketPlayOutMapChunk; +import org.bukkit.craftbukkit.v1_15_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class Chunk_15 { + private Chunk_15(){} + + public static void sendChunk(Player p, int chunkX, int chunkZ){ + ((CraftPlayer)p).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk)p.getWorld().getChunkAt(chunkX, chunkZ)).getHandle(), 65535)); + } +} diff --git a/SpigotCore_8/src/de/steamwar/chunk/Chunk_8.java b/SpigotCore_8/src/de/steamwar/chunk/Chunk_8.java new file mode 100644 index 0000000..5618022 --- /dev/null +++ b/SpigotCore_8/src/de/steamwar/chunk/Chunk_8.java @@ -0,0 +1,14 @@ +package de.steamwar.chunk; + +import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunk; +import org.bukkit.craftbukkit.v1_8_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class Chunk_8 { + private Chunk_8(){} + + public static void sendChunk(Player p, int chunkX, int chunkZ){ + ((CraftPlayer)p).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk)p.getWorld().getChunkAt(chunkX, chunkZ)).getHandle(), true, 65535)); + } +} diff --git a/SpigotCore_9/src/de/steamwar/chunk/Chunk_9.java b/SpigotCore_9/src/de/steamwar/chunk/Chunk_9.java new file mode 100644 index 0000000..ba1b096 --- /dev/null +++ b/SpigotCore_9/src/de/steamwar/chunk/Chunk_9.java @@ -0,0 +1,14 @@ +package de.steamwar.chunk; + +import net.minecraft.server.v1_9_R2.PacketPlayOutMapChunk; +import org.bukkit.craftbukkit.v1_9_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; + +public class Chunk_9 { + private Chunk_9(){} + + public static void sendChunk(Player p, int chunkX, int chunkZ){ + ((CraftPlayer)p).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk)p.getWorld().getChunkAt(chunkX, chunkZ)).getHandle(), 65535)); + } +} diff --git a/SpigotCore_Main/pom.xml b/SpigotCore_Main/pom.xml index ae6b0df..d7ffdec 100644 --- a/SpigotCore_Main/pom.xml +++ b/SpigotCore_Main/pom.xml @@ -56,6 +56,12 @@ 1.0 provided + + steamwar + ProtocolLib + 1.0 + provided + steamwar SpigotCore_API diff --git a/SpigotCore_Main/src/de/steamwar/core/Core.java b/SpigotCore_Main/src/de/steamwar/core/Core.java index d7e778c..ea5a2bd 100644 --- a/SpigotCore_Main/src/de/steamwar/core/Core.java +++ b/SpigotCore_Main/src/de/steamwar/core/Core.java @@ -1,6 +1,7 @@ package de.steamwar.core; import de.steamwar.core.events.ChattingEvent; +import de.steamwar.core.events.ChunkListener; import de.steamwar.core.events.PlayerJoinedEvent; import de.steamwar.core.events.WorldLoadEvent; import de.steamwar.sql.SQL; @@ -38,6 +39,7 @@ public class Core extends JavaPlugin{ Bukkit.getPluginManager().registerEvents(new PlayerJoinedEvent(), this); Bukkit.getPluginManager().registerEvents(new ChattingEvent(), this); Bukkit.getPluginManager().registerEvents(new WorldLoadEvent(), this); + ChunkListener.init(); if(version >= 12) ErrorLogger.init(); } diff --git a/SpigotCore_Main/src/de/steamwar/core/events/ChunkListener.java b/SpigotCore_Main/src/de/steamwar/core/events/ChunkListener.java new file mode 100644 index 0000000..fe7d74f --- /dev/null +++ b/SpigotCore_Main/src/de/steamwar/core/events/ChunkListener.java @@ -0,0 +1,64 @@ +package de.steamwar.core.events; + +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.reflect.StructureModifier; +import de.steamwar.chunk.*; +import de.steamwar.core.Core; +import de.steamwar.sql.SteamwarUser; +import org.bukkit.entity.Player; + +public class ChunkListener { + private ChunkListener(){} + + public static void init(){ + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(Core.getInstance(), PacketType.Play.Server.MAP_CHUNK) { + @Override + public void onPacketSending(PacketEvent e) { + Player p = e.getPlayer(); + SteamwarUser user = SteamwarUser.get(p.getUniqueId()); + if(!user.isBedrock()) + return; + + PacketContainer packet = e.getPacket(); + StructureModifier fullChunk = packet.getBooleans(); + if(fullChunk.read(0)) + return; + + e.setCancelled(true); + + StructureModifier ints = packet.getIntegers(); + int chunkX = ints.read(0); + int chunkZ = ints.read(1); + + sendChunk(p, chunkX, chunkZ); + } + }); + } + + public static void sendChunk(Player p, int chunkX, int chunkZ){ + switch(Core.getVersion()){ + case 15: + Chunk_15.sendChunk(p, chunkX, chunkZ); + break; + case 14: + Chunk_14.sendChunk(p, chunkX, chunkZ); + break; + case 12: + Chunk_12.sendChunk(p, chunkX, chunkZ); + break; + case 10: + Chunk_10.sendChunk(p, chunkX, chunkZ); + break; + case 9: + Chunk_9.sendChunk(p, chunkX, chunkZ); + break; + case 8: + Chunk_8.sendChunk(p, chunkX, chunkZ); + break; + } + } +} diff --git a/SpigotCore_Main/src/de/steamwar/sql/SteamwarUser.java b/SpigotCore_Main/src/de/steamwar/sql/SteamwarUser.java index ea2eac9..fb25b5d 100644 --- a/SpigotCore_Main/src/de/steamwar/sql/SteamwarUser.java +++ b/SpigotCore_Main/src/de/steamwar/sql/SteamwarUser.java @@ -26,6 +26,7 @@ public class SteamwarUser { private final String userName; private final UserGroup userGroup; private final int team; + private final boolean bedrock; private SteamwarUser(ResultSet rs){ try { @@ -34,6 +35,7 @@ public class SteamwarUser { userName = rs.getString("UserName"); userGroup = UserGroup.valueOf(rs.getString("UserGroup")); team = rs.getInt("Team"); + bedrock = rs.getBoolean("Bedrock"); byUUID.put(uuid, this); byName.put(userName.toLowerCase(), this); @@ -63,6 +65,10 @@ public class SteamwarUser { return team; } + public boolean isBedrock(){ + return bedrock; + } + private static SteamwarUser fromDB(String statement, Object identifier){ ResultSet rs = SQL.select(statement, identifier); try { diff --git a/SpigotCore_Main/src/plugin.yml b/SpigotCore_Main/src/plugin.yml index 8eee87b..370fc34 100644 --- a/SpigotCore_Main/src/plugin.yml +++ b/SpigotCore_Main/src/plugin.yml @@ -5,6 +5,8 @@ api-version: "1.13" load: STARTUP softdepend: - WorldEdit +depend: + - ProtocolLib main: de.steamwar.core.Core commands: \ No newline at end of file