Guest User

Untitled

a guest
Mar 18th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. package com.penzzly.engine.core.mini;
  2.  
  3. import com.google.common.collect.ArrayListMultimap;
  4. import com.google.common.collect.Multimap;
  5. import io.netty.channel.Channel;
  6. import io.netty.channel.ChannelDuplexHandler;
  7. import io.netty.channel.ChannelHandlerContext;
  8. import io.netty.channel.ChannelPromise;
  9. import net.minecraft.server.v1_12_R1.NetworkManager;
  10. import net.minecraft.server.v1_12_R1.Packet;
  11. import net.minecraft.server.v1_12_R1.PacketPlayOutAbilities;
  12. import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
  13. import org.bukkit.entity.Player;
  14. import org.bukkit.event.player.PlayerJoinEvent;
  15. import org.bukkit.event.player.PlayerQuitEvent;
  16. import org.jetbrains.annotations.NotNull;
  17.  
  18. import java.io.Closeable;
  19. import java.lang.reflect.Field;
  20. import java.util.List;
  21. import java.util.function.BiConsumer;
  22. import java.util.function.BiPredicate;
  23.  
  24. import static com.penzzly.engine.core.base.Events.listen;
  25. import static net.jodah.typetools.TypeResolver.resolveRawArgument;
  26.  
  27. @SuppressWarnings("unchecked")
  28. public class Injector {
  29. private static final String HANDLER = "packet_handler";
  30. private static final String INJECTOR = "packet_handler";
  31. private static final Field CHANNEL;
  32. private final Multimap<Class<?>, BiPredicate<Player, Packet>> packetListeners = ArrayListMultimap.create();
  33.  
  34. static {
  35. try {
  36. CHANNEL = NetworkManager.class.getDeclaredField("m");
  37. } catch (Exception e) {
  38. throw new RuntimeException(e);
  39. }
  40. }
  41.  
  42. @NotNull
  43. public Injection inject(@NotNull Player player) {
  44. ChannelDuplexHandler handler = new ChannelDuplexHandler() {
  45. @Override
  46. public void channelRead(ChannelHandlerContext context, Object packet) throws Exception {
  47. if (handle(player, (Packet) packet)) {
  48. super.channelRead(context, packet);
  49. }
  50. }
  51.  
  52. @Override
  53. public void write(ChannelHandlerContext context, Object packet, ChannelPromise promise) throws Exception {
  54. if (handle(player, (Packet) packet)) {
  55. super.write(context, packet, promise);
  56. }
  57. }
  58. };
  59.  
  60. final Channel channel;
  61. try {
  62. channel = (Channel) CHANNEL.get(((CraftPlayer) player).getHandle().playerConnection.networkManager);
  63. } catch (IllegalAccessException e) {
  64. throw new RuntimeException(e);
  65. }
  66. channel.pipeline().addAfter(HANDLER, INJECTOR, handler);
  67. return () -> channel.pipeline().remove(handler);
  68. }
  69.  
  70. //Example use.
  71. public static void main(String[] args) {
  72. Injector injector = new Injector();
  73. injector.onPacket((Player player, PacketPlayOutAbilities packet) -> {
  74. //handle your packet as you see fit...
  75. //doesn't support ping packets... but that's another process entirely...
  76. //if you want to support them just add an injectServer method to do so...
  77. });
  78.  
  79. listen((PlayerJoinEvent joinEvent) -> {
  80. Injection injection = injector.inject(joinEvent.getPlayer());
  81. listen((PlayerQuitEvent quitEvent) -> injection.close());
  82. });
  83. }
  84.  
  85. private boolean handle(Player player, @NotNull Packet packet) {
  86. for (BiPredicate<Player, Packet> listener : packetListeners.get(packet.getClass()))
  87. if (!listener.test(player, packet)) {
  88. return false;
  89. }
  90. return true;
  91. }
  92.  
  93. //--Listeners--
  94. //Receive
  95. public <Type extends Packet> BiPredicate<Player, Type> onPacket(@NotNull BiPredicate<Player, Type> listener) {
  96. return onPacket((Class<Type>) resolveRawArgument(BiPredicate.class, listener.getClass()),
  97. listener);
  98. }
  99.  
  100. public <Type extends Packet> BiPredicate<Player, Type> onPacket(Class<Type> type, BiPredicate<Player, Type> listener) {
  101. packetListeners.put(type, (BiPredicate<Player, Packet>) listener);
  102. return listener;
  103. }
  104.  
  105. @NotNull
  106. public <Type extends Packet> BiConsumer<Player, Type> onPacket(@NotNull BiConsumer<Player, Type> listener) {
  107. return onPacket((Class<Type>) resolveRawArgument(BiConsumer.class, listener.getClass()),
  108. listener);
  109. }
  110.  
  111. @NotNull
  112. public <Type extends Packet> BiConsumer<Player, Type> onPacket(Class<Type> type, @NotNull BiConsumer<Player, Type> listener) {
  113. packetListeners.put(type, (player, packet) -> {
  114. listener.accept(player, (Type) packet);
  115. return true;
  116. });
  117. return listener;
  118. }
  119.  
  120. //--Getters--
  121. //Receive
  122. @NotNull
  123. public <Type extends Packet> List<BiPredicate<Player, Packet>> getPacketListeners(Class<Type> type) {
  124. return (List<BiPredicate<Player, Packet>>) packetListeners.get(type);
  125. }
  126.  
  127. @NotNull
  128. public Multimap<Class<?>, BiPredicate<Player, Packet>> getPacketListeners() {
  129. return packetListeners;
  130. }
  131.  
  132. public interface Injection extends Closeable {
  133. @Override
  134. void close();
  135. }
  136. }
Add Comment
Please, Sign In to add comment