Need Help with Summoning NPCs

Discussion in 'Plugin Development' started by DarkGalaxy, Jan 3, 2018.

Thread Status:
Not open for further replies.
  1. Offline

    DarkGalaxy

    I'm new to using NMS , and I'm trying to summon a copy of a Player when they run a command. My Current code is
    Code:java
    1.  
    2. WorldServer world = ((CraftWorld) player.getWorld()).getHandle();
    3.  
    4. EntityPlayer npc = new EntityPlayer(((CraftServer)player.getServer()).getServer(), world, new GameProfile(player.getUniqueId(), player.getDisplayName()), new PlayerInteractManager(world));
    5.  
    6. npc.setLocation(player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), player.getLocation().getYaw(), player.getLocation().getPitch());
    7.  
    8. ItemStack feet = player.getInventory().getBoots();
    9. ItemStack legs = player.getInventory().getLeggings();
    10. ItemStack body = player.getInventory().getChestplate();
    11. ItemStack head = player.getInventory().getHelmet();
    12. ItemStack mainHand = player.getInventory().getItemInMainHand();
    13. ItemStack offHand = player.getInventory().getItemInOffHand();
    14.  
    15. npc.setEquipment(EnumItemSlot.FEET, CraftItemStack.asNMSCopy(feet));
    16. npc.setEquipment(EnumItemSlot.LEGS, CraftItemStack.asNMSCopy(legs));
    17. npc.setEquipment(EnumItemSlot.CHEST, CraftItemStack.asNMSCopy(body));
    18. npc.setEquipment(EnumItemSlot.HEAD, CraftItemStack.asNMSCopy(head));
    19. npc.setEquipment(EnumItemSlot.MAINHAND, CraftItemStack.asNMSCopy(mainHand));
    20. npc.setEquipment(EnumItemSlot.OFFHAND, CraftItemStack.asNMSCopy(offHand));
    21.  
    22. NetworkManager manager = new FixedNetworkManager();
    23. PlayerConnection playerConnection = new DummyPlayerConnection(((CraftServer)player.getServer()).getServer(), manager, npc);
    24. npc.playerConnection = playerConnection;
    25. world.addEntity(npc);
    26.  

    This creates a copy of the player, but it gives a warning to console and the player has to relog since the entity has the same UUID.
    I also tried using
    Code:java
    1.  
    2. WorldServer world = ((CraftWorld) player.getWorld()).getHandle();
    3. GameProfile gp = ((CraftPlayer) player).getProfile();
    4. Property property = gp.getProperties().get("textures").iterator().next();
    5. String texture = property.getValue();
    6. String signature = property.getSignature();
    7.  
    8. GameProfile gp2 = new GameProfile(UUID.randomUUID(), player.getDisplayName());
    9. gp2.getProperties().put("textures", new Property("textures",texture,signature));
    10.  
    11. EntityPlayer npc = new EntityPlayer(((CraftServer)player.getServer()).getServer(), world, gp2, new PlayerInteractManager(world));
    12. npc.setLocation(player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), player.getLocation().getYaw(), player.getLocation().getPitch());
    13.  
    14. ItemStack feet = player.getInventory().getBoots();
    15. ItemStack legs = player.getInventory().getLeggings();
    16. ItemStack body = player.getInventory().getChestplate();
    17. ItemStack head = player.getInventory().getHelmet();
    18. ItemStack mainHand = player.getInventory().getItemInMainHand();
    19. ItemStack offHand = player.getInventory().getItemInOffHand();
    20.  
    21. npc.setEquipment(EnumItemSlot.FEET, CraftItemStack.asNMSCopy(feet));
    22. npc.setEquipment(EnumItemSlot.LEGS, CraftItemStack.asNMSCopy(legs));
    23. npc.setEquipment(EnumItemSlot.CHEST, CraftItemStack.asNMSCopy(body));
    24. npc.setEquipment(EnumItemSlot.HEAD, CraftItemStack.asNMSCopy(head));
    25. npc.setEquipment(EnumItemSlot.MAINHAND, CraftItemStack.asNMSCopy(mainHand));
    26. npc.setEquipment(EnumItemSlot.OFFHAND, CraftItemStack.asNMSCopy(offHand));
    27.  
    28. NetworkManager manager = new FixedNetworkManager();
    29. PlayerConnection playerConnection = new DummyPlayerConnection(((CraftServer)player.getServer()).getServer(), manager, npc);
    30. npc.playerConnection = playerConnection;
    31. world.addEntity(npc);
    32.  

    This summons an invisible Player (I know this because zombies will attack and kill them), and gives no error to console. Additionally, any npcs spawned don't have the equipment of the player (in either method). Any help is appreciated. Thanks!

    My additional classes -

    NullChannel.java
    Code:java
    1.  
    2. package org.resources;
    3.  
    4.  
    5.  
    6. import io.netty.channel.*;
    7.  
    8.  
    9. import java.net.SocketAddress;
    10.  
    11.  
    12. public class NullChannel extends AbstractChannel {
    13.  
    14.  
    15.  
    16. protected NullChannel(Channel parent) {
    17.  
    18. super(parent);
    19.  
    20. }
    21.  
    22.  
    23. @Override
    24.  
    25. protected AbstractUnsafe newUnsafe() {
    26.  
    27. return null;
    28.  
    29. }
    30.  
    31.  
    32. @Override
    33.  
    34. protected boolean isCompatible(EventLoop eventExecutors) {
    35.  
    36. return true;
    37.  
    38. }
    39.  
    40.  
    41. @Override
    42.  
    43. protected SocketAddress localAddress0() {
    44.  
    45. return null;
    46.  
    47. }
    48.  
    49.  
    50. @Override
    51.  
    52. protected SocketAddress remoteAddress0() {
    53.  
    54. return null;
    55.  
    56. }
    57.  
    58.  
    59. @Override
    60.  
    61. protected void doBind(SocketAddress socketAddress) throws Exception {
    62.  
    63.  
    64. }
    65.  
    66.  
    67. @Override
    68.  
    69. protected void doDisconnect() throws Exception {
    70.  
    71.  
    72. }
    73.  
    74.  
    75. @Override
    76.  
    77. protected void doClose() throws Exception {
    78.  
    79.  
    80. }
    81.  
    82.  
    83. @Override
    84.  
    85. protected void doBeginRead() throws Exception {
    86.  
    87.  
    88. }
    89.  
    90.  
    91. @Override
    92.  
    93. protected void doWrite(ChannelOutboundBuffer channelOutboundBuffer) throws Exception {
    94.  
    95.  
    96. }
    97.  
    98.  
    99. @Override
    100.  
    101. public ChannelConfig config() {
    102.  
    103. return new DefaultChannelConfig(this);
    104.  
    105. }
    106.  
    107.  
    108. @Override
    109.  
    110. public boolean isOpen() {
    111.  
    112. return true;
    113.  
    114. }
    115.  
    116.  
    117. @Override
    118.  
    119. public boolean isActive() {
    120.  
    121. returnfalse;
    122.  
    123. }
    124.  
    125.  
    126. @Override
    127.  
    128. public ChannelMetadata metadata() {
    129.  
    130. return null;
    131.  
    132. }
    133.  
    134. }
    135.  


    DummyPlayerConnection.java

    Code:java
    1.  
    2. package org.resources;
    3.  
    4. import org.bukkit.Bukkit;
    5. import org.bukkit.Location;
    6.  
    7. import net.minecraft.server.v1_12_R1.EntityPlayer;
    8. import net.minecraft.server.v1_12_R1.EnumProtocol;
    9. import net.minecraft.server.v1_12_R1.IChatBaseComponent;
    10. import net.minecraft.server.v1_12_R1.MinecraftServer;
    11. import net.minecraft.server.v1_12_R1.NetworkManager;
    12. import net.minecraft.server.v1_12_R1.Packet;
    13. import net.minecraft.server.v1_12_R1.PacketPlayInAbilities;
    14. import net.minecraft.server.v1_12_R1.PacketPlayInArmAnimation;
    15. import net.minecraft.server.v1_12_R1.PacketPlayInBlockDig;
    16. import net.minecraft.server.v1_12_R1.PacketPlayInBlockPlace;
    17. import net.minecraft.server.v1_12_R1.PacketPlayInChat;
    18. import net.minecraft.server.v1_12_R1.PacketPlayInClientCommand;
    19. import net.minecraft.server.v1_12_R1.PacketPlayInCloseWindow;
    20. import net.minecraft.server.v1_12_R1.PacketPlayInCustomPayload;
    21. import net.minecraft.server.v1_12_R1.PacketPlayInEnchantItem;
    22. import net.minecraft.server.v1_12_R1.PacketPlayInEntityAction;
    23. import net.minecraft.server.v1_12_R1.PacketPlayInFlying;
    24. import net.minecraft.server.v1_12_R1.PacketPlayInHeldItemSlot;
    25. import net.minecraft.server.v1_12_R1.PacketPlayInKeepAlive;
    26. import net.minecraft.server.v1_12_R1.PacketPlayInSetCreativeSlot;
    27. import net.minecraft.server.v1_12_R1.PacketPlayInSettings;
    28. import net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle;
    29. import net.minecraft.server.v1_12_R1.PacketPlayInTabComplete;
    30. import net.minecraft.server.v1_12_R1.PacketPlayInTransaction;
    31. import net.minecraft.server.v1_12_R1.PacketPlayInUpdateSign;
    32. import net.minecraft.server.v1_12_R1.PacketPlayInUseEntity;
    33. import net.minecraft.server.v1_12_R1.PacketPlayInWindowClick;
    34. import net.minecraft.server.v1_12_R1.PlayerConnection;
    35. import net.minecraft.server.v1_12_R1.WorldServer;
    36. import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
    37. import org.bukkit.craftbukkit.v1_12_R1.CraftServer;
    38.  
    39. public class DummyPlayerConnection extends PlayerConnection {
    40.  
    41. public DummyPlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) {
    42. super(minecraftserver, networkmanager, entityplayer);
    43. }
    44.  
    45. @Override
    46. public CraftPlayer getPlayer() {
    47. return (this.player == null) ? null : this.player.getBukkitEntity();
    48. }
    49.  
    50. @Override
    51. public NetworkManager a() {
    52. return networkManager;
    53. }
    54.  
    55. public NetworkManager b() {
    56. return this.networkManager;
    57. }
    58.  
    59. public void disconnect() {
    60. WorldServer worldserver = player.x();
    61.  
    62. worldserver.kill(player);
    63. worldserver.getPlayerChunkMap().removePlayer(player);
    64. ((CraftServer) Bukkit.getServer()).getHandle().players.remove(player);
    65. }
    66.  
    67. public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) {
    68. }
    69.  
    70. public void a(PacketPlayInFlying packetplayinflying) {
    71. }
    72.  
    73. public void a(double d0, double d1, double d2, float f, float f1) {
    74. }
    75.  
    76. public void teleport(Location dest) {
    77. }
    78.  
    79. public void a(PacketPlayInBlockDig packetplayinblockdig) {
    80. }
    81.  
    82. public void a(PacketPlayInBlockPlace packetplayinblockplace) {
    83. }
    84.  
    85. public void a(IChatBaseComponent ichatbasecomponent) {
    86. }
    87.  
    88. public void sendPacket(Packet packet) {
    89. }
    90.  
    91. public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) {
    92. }
    93.  
    94. public void a(PacketPlayInChat packetplayinchat) {
    95. }
    96.  
    97. public void chat(String s, boolean async) {
    98. }
    99.  
    100. public void a(PacketPlayInArmAnimation packetplayinarmanimation) {
    101. }
    102.  
    103. public void a(PacketPlayInEntityAction packetplayinentityaction) {
    104. }
    105.  
    106. public void a(PacketPlayInUseEntity packetplayinuseentity) {
    107. }
    108.  
    109. public void a(PacketPlayInClientCommand packetplayinclientcommand) {
    110. }
    111.  
    112. public void a(PacketPlayInCloseWindow packetplayinclosewindow) {
    113. }
    114.  
    115. public void a(PacketPlayInWindowClick packetplayinwindowclick) {
    116. }
    117.  
    118. public void a(PacketPlayInEnchantItem packetplayinenchantitem) {
    119. }
    120.  
    121. public void a(PacketPlayInSetCreativeSlot packetplayinsetcreativeslot) {
    122. }
    123.  
    124. public void a(PacketPlayInTransaction packetplayintransaction) {
    125. }
    126.  
    127. public void a(PacketPlayInUpdateSign packetplayinupdatesign) {
    128. }
    129.  
    130. public void a(PacketPlayInKeepAlive packetplayinkeepalive) {
    131. }
    132.  
    133. public void a(PacketPlayInAbilities packetplayinabilities) {
    134. }
    135.  
    136. public void a(PacketPlayInTabComplete packetplayintabcomplete) {
    137. }
    138.  
    139. public void a(PacketPlayInSettings packetplayinsettings) {
    140. }
    141.  
    142. public void a(PacketPlayInCustomPayload packetplayincustompayload) {
    143. }
    144.  
    145. public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) {
    146. }
    147. }
    148.  


    FixedNetworkManager.java


    Code:java
    1.  
    2. package org.resources;
    3.  
    4.  
    5.  
    6. import io.netty.channel.Channel;
    7.  
    8. import io.netty.util.AttributeKey;
    9.  
    10. import net.minecraft.server.v1_12_R1.EnumProtocolDirection;
    11.  
    12. import net.minecraft.server.v1_12_R1.NetworkManager;
    13.  
    14.  
    15.  
    16. import java.lang.reflect.Field;
    17.  
    18. import java.net.SocketAddress;
    19.  
    20.  
    21.  
    22. public class FixedNetworkManager extends NetworkManager {
    23.  
    24.  
    25.  
    26. public FixedNetworkManager() {
    27.  
    28. super(EnumProtocolDirection.CLIENTBOUND);
    29.  
    30.  
    31.  
    32. try {
    33.  
    34. Field channelField = NetworkManager.class.getDeclaredField( "channel" );
    35.  
    36. channelField.setAccessible( true );
    37.  
    38. channelField.set( this , new NullChannel( null ) );
    39.  
    40. channelField.setAccessible( false );
    41.  
    42.  
    43.  
    44. Field socketAddressField = NetworkManager.class.getDeclaredField( "l" );
    45.  
    46. socketAddressField.setAccessible( true );
    47.  
    48. socketAddressField.set( this , null );
    49.  
    50. socketAddressField.setAccessible( true );
    51.  
    52. } catch(Exception e) {
    53.  
    54. e.printStackTrace();
    55.  
    56. }
    57.  
    58. }
    59.  
    60. }
    61.  
     
Thread Status:
Not open for further replies.

Share This Page