Need help with NPC plugin

Discussion in 'Plugin Development' started by kevinspl2000, Oct 27, 2013.

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

    kevinspl2000

    Okay so this is my Human.class
    Code:java
    1. package NPCSpawning;
    2.  
    3. import java.lang.reflect.Field;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. import java.util.Random;
    7. import java.util.UUID;
    8.  
    9. import net.minecraft.server.v1_6_R3.DataWatcher;
    10. import net.minecraft.server.v1_6_R3.EntityHuman;
    11. import net.minecraft.server.v1_6_R3.Packet17EntityLocationAction;
    12. import net.minecraft.server.v1_6_R3.Packet18ArmAnimation;
    13. import net.minecraft.server.v1_6_R3.Packet20NamedEntitySpawn;
    14. import net.minecraft.server.v1_6_R3.Packet29DestroyEntity;
    15. import net.minecraft.server.v1_6_R3.Packet33RelEntityMoveLook;
    16. import net.minecraft.server.v1_6_R3.Packet40EntityMetadata;
    17. import net.minecraft.server.v1_6_R3.Packet5EntityEquipment;
    18.  
    19. import org.bukkit.Bukkit;
    20. import org.bukkit.Color;
    21. import org.bukkit.EntityEffect;
    22. import org.bukkit.Location;
    23. import org.bukkit.Server;
    24. import org.bukkit.World;
    25. import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
    26. import org.bukkit.entity.Entity;
    27. import org.bukkit.entity.EntityType;
    28. import org.bukkit.entity.Player;
    29. import org.bukkit.event.entity.EntityDamageEvent;
    30. import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
    31. import org.bukkit.inventory.ItemStack;
    32. import org.bukkit.metadata.MetadataValue;
    33. import org.bukkit.plugin.Plugin;
    34. import org.bukkit.util.Vector;
    35.  
    36.  
    37. public class Human implements Entity{
    38. String name;
    39. Location world;
    40. int id;
    41. Location l;
    42. int itemInHand;
    43.  
    44. private List<Integer> ids = new ArrayList<Integer>();
    45.  
    46. public Human(Location location, String name, int id, Location l, int itemInHand) {
    47. this.name = name;
    48. this.world = location;
    49. this.id = id;
    50. this.l = l;
    51. this.itemInHand = itemInHand;
    52. Packet20NamedEntitySpawn spawn = new Packet20NamedEntitySpawn();
    53. spawn.a = id;
    54. spawn.b = name;
    55. spawn.c = l.getBlockX() * 32;
    56. spawn.d = l.getBlockY() * 32;
    57. spawn.e = l.getBlockZ() * 32;
    58. spawn.f = getCompressedAngle(l.getYaw());
    59. spawn.g = getCompressedAngle(l.getPitch());
    60. spawn.h = itemInHand;
    61. DataWatcher d = new DataWatcher();
    62. d.a(0, (Object) (byte) 0);
    63. d.a(1, (Object) (short) 0);
    64. d.a(8, (Object) (byte) 0);
    65. try
    66. {
    67. Field nameField = Packet20NamedEntitySpawn.class.getDeclaredField("i");
    68. nameField.setAccessible(true);
    69. nameField.set(spawn, d);
    70. } catch(Exception e) {
    71. e.printStackTrace();
    72. }
    73. for(Player p : Bukkit.getOnlinePlayers()) {
    74. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(spawn);
    75. }
    76. ids.add(id);
    77. }
    78.  
    79. public Human(EntityHuman h) {
    80. Packet20NamedEntitySpawn spawn = new Packet20NamedEntitySpawn(h);
    81. int id = new Random().nextInt(5000-1000)+1000;
    82. spawn.a = id;
    83. this.id = id;
    84. Packet5EntityEquipment armor1 = new Packet5EntityEquipment(id, 1, h.inventory.getArmorContents()[0]);
    85. Packet5EntityEquipment armor2 = new Packet5EntityEquipment(id, 2, h.inventory.getArmorContents()[1]);
    86. Packet5EntityEquipment armor3 = new Packet5EntityEquipment(id, 3, h.inventory.getArmorContents()[2]);
    87. Packet5EntityEquipment armor4 = new Packet5EntityEquipment(id, 4, h.inventory.getArmorContents()[3]);
    88. Packet5EntityEquipment sword = new Packet5EntityEquipment(id, 0, h.inventory.getItem(0));
    89. for(Player p : Bukkit.getOnlinePlayers()) {
    90. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(spawn);
    91. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(armor1);
    92. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(armor2);
    93. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(armor3);
    94. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(armor4);
    95. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(sword);
    96. }
    97. }
    98.  
    99. private byte getCompressedAngle(float value) {
    100. return (byte) (value * 256.0F / 360.0F);
    101. }
    102.  
    103. public void remove() {
    104. Packet29DestroyEntity packet = new Packet29DestroyEntity(id);
    105. for(Player p : Bukkit.getOnlinePlayers()) {
    106. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet);
    107. }
    108. }
    109.  
    110. @SuppressWarnings("deprecation")
    111. public void setItemInHand(ItemStack i) {
    112. Packet29DestroyEntity packet = new Packet29DestroyEntity(id);
    113. for(Player p : Bukkit.getOnlinePlayers()) {
    114. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet);
    115. }
    116. Packet20NamedEntitySpawn spawn = new Packet20NamedEntitySpawn();
    117. spawn.a = id;
    118. spawn.b = name;
    119. spawn.c = l.getBlockX() * 32;
    120. spawn.d = l.getBlockY() * 32;
    121. spawn.e = l.getBlockZ() * 32;
    122. spawn.f = getCompressedAngle(l.getYaw());
    123. spawn.g = getCompressedAngle(l.getPitch());
    124. spawn.h = i.getTypeId();
    125. itemInHand = i.getTypeId();
    126. DataWatcher d = new DataWatcher();
    127. d.a(0, (Object) (byte) 0);
    128. d.a(1, (Object) (short) 0);
    129. d.a(8, (Object) (byte) 0);
    130. try
    131. {
    132. Field nameField = Packet20NamedEntitySpawn.class.getDeclaredField("i");
    133. nameField.setAccessible(true);
    134. nameField.set(spawn, d);
    135. } catch(Exception e) {
    136. e.printStackTrace();
    137. }
    138. for(Player p : Bukkit.getOnlinePlayers()) {
    139. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(spawn);
    140. }
    141. }
    142.  
    143. @Deprecated
    144. public void setName(String s) {
    145. DataWatcher d = new DataWatcher();
    146. d.a(0, (Object) (byte) 0);
    147. d.a(1, (Object) (short) 0);
    148. d.a(8, (Object) (byte) 0);
    149. d.a(10, (Object) (String) s);
    150. //d.a(11, (Object) (byte) 0);
    151. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    152. for(Player p : Bukkit.getOnlinePlayers()) {
    153. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    154. }
    155. }
    156.  
    157. public void hideForPlayer(Player p) {
    158. DataWatcher d = new DataWatcher();
    159. d.a(0, (Object) (byte) 32);
    160. d.a(1, (Object) (short) 0);
    161. d.a(8, (Object) (byte) 0);
    162. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    163. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    164. }
    165.  
    166. public void showForPlayer(Player p) {
    167. DataWatcher d = new DataWatcher();
    168. d.a(0, (Object) (byte) 0);
    169. d.a(1, (Object) (short) 0);
    170. d.a(8, (Object) (byte) 0);
    171. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    172. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    173. }
    174.  
    175. public void addPotionColor(Color r) {
    176. int color = r.asBGR();
    177. final DataWatcher dw = new DataWatcher();
    178. dw.a(7, Integer.valueOf(color));
    179. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, dw, true);
    180. for(Player p : Bukkit.getOnlinePlayers()) {
    181. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    182. }
    183. }
    184.  
    185. public void addPotionColor(int color) {
    186. final DataWatcher dw = new DataWatcher();
    187. dw.a(7, Integer.valueOf(color));
    188. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, dw, true);
    189. for(Player p : Bukkit.getOnlinePlayers()) {
    190. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    191. }
    192. }
    193.  
    194. public void walk(double a, double b, double c) {
    195. //teleports, not walks
    196. byte x = (byte) a;
    197. byte y = (byte) b;
    198. byte z = (byte) c;
    199. Packet33RelEntityMoveLook packet = new Packet33RelEntityMoveLook();
    200. packet.a = id;
    201. packet.b = x;
    202. packet.c = y;
    203. packet.d = z;
    204. packet.e = getCompressedAngle(l.getYaw());
    205. packet.f = getCompressedAngle(l.getPitch());
    206. for(Player p : Bukkit.getOnlinePlayers()) {
    207. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet);
    208. }
    209. l.setX(x);
    210. l.setY(y);
    211. l.setZ(z);
    212. }
    213.  
    214. public void setInvisible() {
    215. DataWatcher d = new DataWatcher();
    216. d.a(0, (Object) (byte) 32);
    217. d.a(1, (Object) (short) 0);
    218. d.a(8, (Object) (byte) 0);
    219. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    220. for(Player p : Bukkit.getOnlinePlayers()) {
    221. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    222. }
    223. }
    224.  
    225. public void setCrouched() {
    226. DataWatcher d = new DataWatcher();
    227. d.a(0, (Object) (byte) 2);
    228. d.a(1, (Object) (short) 0);
    229. d.a(8, (Object) (byte) 0);
    230. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    231. for(Player p : Bukkit.getOnlinePlayers()) {
    232. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    233. }
    234. }
    235.  
    236. public void reset() {
    237. DataWatcher d = new DataWatcher();
    238. d.a(0, (Object) (byte) 0);
    239. d.a(1, (Object) (short) 0);
    240. d.a(8, (Object) (byte) 0);
    241. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    242. for(Player p : Bukkit.getOnlinePlayers()) {
    243. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    244. }
    245. }
    246.  
    247. public void sprint() {
    248. DataWatcher d = new DataWatcher();
    249. d.a(0, (Object) (byte) 8);
    250. d.a(1, (Object) (short) 0);
    251. d.a(8, (Object) (byte) 0);
    252. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    253. for(Player p : Bukkit.getOnlinePlayers()) {
    254. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    255. }
    256. }
    257.  
    258. @Deprecated
    259. public void block() {
    260. DataWatcher d = new DataWatcher();
    261. d.a(0, (Object) (byte) 16);
    262. d.a(1, (Object) (short) 0);
    263. d.a(6, (Object) (byte) 0);
    264. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(id, d, true);
    265. for(Player p : Bukkit.getOnlinePlayers()) {
    266. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    267. }
    268. }
    269.  
    270. public void damage() {
    271. Packet18ArmAnimation packet18 = new Packet18ArmAnimation();
    272. packet18.a = id;
    273. packet18.b = 2;
    274. for(Player p : Bukkit.getOnlinePlayers()) {
    275. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet18);
    276. }
    277. }
    278.  
    279. public void swingArm() {
    280. Packet18ArmAnimation packet18 = new Packet18ArmAnimation();
    281. packet18.a = id;
    282. packet18.b = 1;
    283. for(Player p : Bukkit.getOnlinePlayers()) {
    284. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet18);
    285. }
    286. }
    287.  
    288. @Deprecated
    289. public void eatInHand() {
    290. Packet18ArmAnimation packet18 = new Packet18ArmAnimation();
    291. packet18.a = id;
    292. packet18.b = 5;
    293. for(Player p : Bukkit.getOnlinePlayers()) {
    294. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet18);
    295. }
    296. }
    297.  
    298. public void sleep() {
    299. Packet17EntityLocationAction packet17 = new Packet17EntityLocationAction();
    300. packet17.a = id;
    301. packet17.b = (int) getX();
    302. packet17.c = (int) getY();
    303. packet17.d = (int) getZ();
    304. packet17.e = 0;
    305. for(Player p : Bukkit.getOnlinePlayers()) {
    306. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet17);
    307. }
    308. }
    309.  
    310. public double getX() {
    311. return l.getX();
    312. }
    313.  
    314. public double getY() {
    315. return l.getY();
    316. }
    317.  
    318. public double getZ() {
    319. return l.getZ();
    320. }
    321.  
    322. @Override
    323. public List<MetadataValue> getMetadata(String arg0) {
    324. // TODO Auto-generated method stub
    325. return null;
    326. }
    327.  
    328. @Override
    329. public boolean hasMetadata(String arg0) {
    330. // TODO Auto-generated method stub
    331. return false;
    332. }
    333.  
    334. @Override
    335. public void removeMetadata(String arg0, Plugin arg1) {
    336. // TODO Auto-generated method stub
    337.  
    338. }
    339.  
    340. @Override
    341. public void setMetadata(String arg0, MetadataValue arg1) {
    342. // TODO Auto-generated method stub
    343.  
    344. }
    345.  
    346. @Override
    347. public boolean eject() {
    348. // TODO Auto-generated method stub
    349. return false;
    350. }
    351.  
    352. @Override
    353. public int getEntityId() {
    354. // TODO Auto-generated method stub
    355. return 0;
    356. }
    357.  
    358. @Override
    359. public float getFallDistance() {
    360. // TODO Auto-generated method stub
    361. return 0;
    362. }
    363.  
    364. @Override
    365. public int getFireTicks() {
    366. // TODO Auto-generated method stub
    367. return 0;
    368. }
    369.  
    370. @Override
    371. public EntityDamageEvent getLastDamageCause() {
    372. // TODO Auto-generated method stub
    373. return null;
    374. }
    375.  
    376. @Override
    377. public Location getLocation() {
    378. // TODO Auto-generated method stub
    379. return null;
    380. }
    381.  
    382. @Override
    383. public Location getLocation(Location arg0) {
    384. // TODO Auto-generated method stub
    385. return null;
    386. }
    387.  
    388. @Override
    389. public int getMaxFireTicks() {
    390. // TODO Auto-generated method stub
    391. return 0;
    392. }
    393.  
    394. @Override
    395. public List<Entity> getNearbyEntities(double arg0, double arg1,
    396. double arg2) {
    397. // TODO Auto-generated method stub
    398. return null;
    399. }
    400.  
    401. @Override
    402. public Entity getPassenger() {
    403. // TODO Auto-generated method stub
    404. return null;
    405. }
    406.  
    407. @Override
    408. public Server getServer() {
    409. // TODO Auto-generated method stub
    410. return null;
    411. }
    412.  
    413. @Override
    414. public int getTicksLived() {
    415. // TODO Auto-generated method stub
    416. return 0;
    417. }
    418.  
    419. @Override
    420. public EntityType getType() {
    421. // TODO Auto-generated method stub
    422. return null;
    423. }
    424.  
    425. @Override
    426. public UUID getUniqueId() {
    427. // TODO Auto-generated method stub
    428. return null;
    429. }
    430.  
    431. @Override
    432. public Entity getVehicle() {
    433. // TODO Auto-generated method stub
    434. return null;
    435. }
    436.  
    437. @Override
    438. public Vector getVelocity() {
    439. // TODO Auto-generated method stub
    440. return null;
    441. }
    442.  
    443. @Override
    444. public World getWorld() {
    445. // TODO Auto-generated method stub
    446. return null;
    447. }
    448.  
    449. @Override
    450. public boolean isDead() {
    451. // TODO Auto-generated method stub
    452. return false;
    453. }
    454.  
    455. @Override
    456. public boolean isEmpty() {
    457. // TODO Auto-generated method stub
    458. return false;
    459. }
    460.  
    461. @Override
    462. public boolean isInsideVehicle() {
    463. // TODO Auto-generated method stub
    464. return false;
    465. }
    466.  
    467. @Override
    468. public boolean isOnGround() {
    469. // TODO Auto-generated method stub
    470. return false;
    471. }
    472.  
    473. @Override
    474. public boolean isValid() {
    475. // TODO Auto-generated method stub
    476. return false;
    477. }
    478.  
    479. @Override
    480. public boolean leaveVehicle() {
    481. // TODO Auto-generated method stub
    482. return false;
    483. }
    484.  
    485. @Override
    486. public void playEffect(EntityEffect arg0) {
    487. // TODO Auto-generated method stub
    488.  
    489. }
    490.  
    491. @Override
    492. public void setFallDistance(float arg0) {
    493. // TODO Auto-generated method stub
    494.  
    495. }
    496.  
    497. @Override
    498. public void setFireTicks(int arg0) {
    499. // TODO Auto-generated method stub
    500.  
    501. }
    502.  
    503. @Override
    504. public void setLastDamageCause(EntityDamageEvent arg0) {
    505. // TODO Auto-generated method stub
    506.  
    507. }
    508.  
    509. @Override
    510. public boolean setPassenger(Entity arg0) {
    511. // TODO Auto-generated method stub
    512. return false;
    513. }
    514.  
    515. @Override
    516. public void setTicksLived(int arg0) {
    517. // TODO Auto-generated method stub
    518.  
    519. }
    520.  
    521. @Override
    522. public void setVelocity(Vector arg0) {
    523. // TODO Auto-generated method stub
    524.  
    525. }
    526.  
    527. @Override
    528. public boolean teleport(Location arg0) {
    529. // TODO Auto-generated method stub
    530. return false;
    531. }
    532.  
    533. @Override
    534. public boolean teleport(Entity arg0) {
    535. // TODO Auto-generated method stub
    536. return false;
    537. }
    538.  
    539. @Override
    540. public boolean teleport(Location arg0, TeleportCause arg1) {
    541. // TODO Auto-generated method stub
    542. return false;
    543. }
    544.  
    545. @Override
    546. public boolean teleport(Entity arg0, TeleportCause arg1) {
    547. // TODO Auto-generated method stub
    548. return false;
    549. }
    550.  
    551. }
    552.  

    I want it if a player damages the entity three times it dissapears and drops a players inventory. The NPC will also only be there for 10 seconds.
    Here is a part of my other code:
    Code:java
    1. human.showForPlayer(otherplayers);
    2. Thread.sleep(1000);
    3. human.hideForPlayer(otherplayers);
    4. return true;

    I dont think the Thread.sleep(100) works.. ;(
     
  2. Offline

    kevinspl2000

  3. kevinspl2000 The best way to do so is to add a health variable and set that to 20.0, and then each time someone clicks the npc, play hurt animation, set health to -1.0 or so...
     
  4. Offline

    kevinspl2000

    CaptainBern
    How would I check if a player has left clicked the NPC?
     
  5. Offline

    xTrollxDudex

    kevinspl2000
    You can't check if you hit something that doesn't exist.
     
  6. Offline

    kevinspl2000

  7. Offline

    xTrollxDudex

  8. xTrollxDudex Actually you can. kevinspl2000 You have to use protocolLib for this. You will need to intercept the incoming Packet7UseEntity. In this packet there are 3 fields, a, b and c. Field a = entityId of the player that send the packet, this is ingored by minecraft. Field b = the entityId of the entity interacted with and Field c, this is the action, it's an integer, when the integer is 1, then it was a left click, if the integer is 0 then it was a right click. xTrollxDudex The EntityDamageEvent will ofcourse not work since it only get's fired by bukkit when an entity get's damaged and bukkit notices this. But since the client thinks there is an entity, it will send the server a packet saying he interacted with that entity. Ofcourse the server doesn't find this entity because it doesn't know about it so the server just ignores it.
     
  9. Offline

    xTrollxDudex

    CaptainBern
    Exactly. It actually doesn't exist server side, technically speaking
     
  10. Offline

    Blah1

    WOW that is a big class haha. Split up your code between classes :)
     
  11. Offline

    kevinspl2000

    CaptainBern
    Thanks really explained carefully and overall really detailed answer.
     
  12. Offline

    Garris0n

    I wondered if it was possible to do this but it hasn't come up where I needed to yet so I never inquired into it :p
     
  13. Offline

    kevinspl2000

    CaptainBern
    Two more questions. What do you mean by intercept and also where would I add all the code? In the Human.class and if is it where all the public void's go? So would I do something like
    Code:java
    1. public void setHealth(Player p) {
    2. DataWatcher d = new DataWatcher();
    3. d.a(); // I don't know what to do here? Sorry no I didn't find any tutorials on the net :(
    4. d.b(); // What in here?
    5. d.c(); // What in these brackets?
    6. Packet40EntityMetadata packet40 = new Packet40EntityMetadata(); // What should I type in these brackets? (id, d, (byte) 0) or what? Or what packet would I even send???
    7. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet40);
    8. }
     
  14. kevinspl2000 You do not need the setHealth method, just create a new variable in the human class that contains the health. Also by intercept I mean you need to detect the incoming packets.
     
  15. Offline

    kevinspl2000

  16. Last edited by a moderator: Jun 5, 2016
  17. Offline

    kevinspl2000

    CaptainBern
    I dont understand a word you are saying ;(. And I dont know what packets to use and how to detect a packet
     
Thread Status:
Not open for further replies.

Share This Page