Item pickup manager - help needed

Discussion in 'Plugin Development' started by Fedmand, Dec 5, 2013.

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

    Fedmand

    Hi fellas!

    I'm working on a plugin that makes sure that only the original item-owner and the killer can pick up the item drops on death. And I'm nearly done!
    There's just one problem though. If a player holds more than one similars itemstack in their inventory, only one of the 2 stacks get saved. Everthing else works! It hurts so bad not to be able to solve the problem...
    Here's the source btw:
    Show Spoiler

    Code:java
    1. package me.punch;
    2.  
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.HashMap;
    6. import org.bukkit.inventory.ItemStack;
    7. import org.bukkit.command.Command;
    8. import org.bukkit.command.CommandSender;
    9. import org.bukkit.entity.Player;
    10. import org.bukkit.event.EventHandler;
    11. import org.bukkit.event.Listener;
    12. import org.bukkit.event.entity.PlayerDeathEvent;
    13. import org.bukkit.event.player.PlayerDropItemEvent;
    14. import org.bukkit.event.player.PlayerPickupItemEvent;
    15. import org.bukkit.plugin.java.JavaPlugin;
    16.  
    17. public final class Main extends JavaPlugin implements Listener {
    18.  
    19. @Override
    20. public void onEnable() {
    21. this.getServer().getPluginManager().registerEvents(this, this);
    22. }
    23.  
    24. boolean enabled = true;
    25. HashMap<Player, ItemStack[]> itemOwners = new HashMap<Player, ItemStack[]>();
    26. HashMap<ItemStack, Player> itemOwners2 = new HashMap<ItemStack, Player>();
    27. HashMap<ItemStack, Player> itemOwners3 = new HashMap<ItemStack, Player>();
    28. HashMap<String, Player> killers = new HashMap<String, Player>();
    29. ArrayList<ItemStack> itemz = new ArrayList<ItemStack>();
    30. ArrayList<ItemStack> nonPrivateItems = new ArrayList<ItemStack>();
    31. ArrayList<Player> disabled = new ArrayList<Player>();
    32.  
    33. public boolean onCommand(CommandSender sender, Command command,
    34. String label, String[] args) {
    35. if (sender instanceof Player) {
    36. Player player = (Player) sender;
    37. if (label.equalsIgnoreCase("toggleloot")) {
    38. if (enabled) {
    39. player.sendMessage("You have disabled the AutoLoot plugin.");
    40. player.sendMessage("Repeat this command to re-enable");
    41. enabled = false;
    42. } else if (!enabled) {
    43. player.sendMessage("You have enabled the AutoLoot plugin.");
    44. player.sendMessage("Repeat this command to disable");
    45. enabled = true;
    46. }
    47. } else if (label.equalsIgnoreCase("ignoreloot")) {
    48. if (!enabled) {
    49. player.sendMessage("The AutoLoot plugin is currently disabled.");
    50. player.sendMessage("Perform /toggleloot to enable the plugin.");
    51. } else if (enabled && player.hasPermission("ignoreloot")
    52. && !disabled.contains(player)) {
    53. disabled.add(player);
    54. player.sendMessage("You can now bypass the antiloot functions.");
    55. player.sendMessage("Perform /ignoreloot again to enable the functions.");
    56. } else if (enabled && player.hasPermission("ignoreloot")
    57. && disabled.contains(player)) {
    58. disabled.remove(player);
    59. player.sendMessage("You have enabled the antiloot functions.");
    60. }
    61. }
    62. }
    63. return false;
    64. }
    65.  
    66. @EventHandler
    67. void Death(final PlayerDeathEvent event) {
    68. if (enabled) {
    69. Player player = event.getEntity();
    70. Player killer = event.getEntity().getKiller();
    71. ItemStack[] items = event.getDrops().toArray(new ItemStack[0]);
    72. itemOwners.put(player, items);
    73. for (ItemStack allItems : event.getDrops()) {
    74. itemOwners2.put(allItems, player);
    75. itemOwners3.put(allItems, killer);
    76. itemz.add(allItems);
    77. }
    78.  
    79. new Thread() {
    80. @Override
    81. public void run() {
    82. try {
    83. Thread.sleep(60000);
    84. itemz.removeAll(event.getDrops());
    85. } catch (InterruptedException ex) {
    86. }
    87. }
    88. }.start();
    89. if (killer != null | killer instanceof Player) {
    90. killers.put(killer.getName(), player);
    91. }
    92. }
    93. }
    94.  
    95. @EventHandler
    96. public void dropItem(PlayerDropItemEvent event) {
    97. nonPrivateItems.add(event.getItemDrop().getItemStack());
    98. }
    99.  
    100. @EventHandler
    101. public void pickupItem(PlayerPickupItemEvent event) {
    102. ItemStack item = event.getItem().getItemStack();
    103. if (enabled && !nonPrivateItems.contains(item)) {
    104. event.setCancelled(true);
    105. Player p0 = event.getPlayer();
    106. ItemStack[] items0 = (ItemStack[]) itemOwners.get(p0);
    107. ItemStack[] items1 = (ItemStack[]) itemOwners.get(killers.get(p0
    108. .getName()));
    109. if (disabled.contains(p0)) {
    110. event.setCancelled(false);
    111. }
    112. if (items0 != null) {
    113. for (ItemStack it : items0) {
    114. if (event.getItem().getItemStack().isSimilar(it)) {
    115. if (itemOwners2.containsKey(it)) {
    116. if (itemOwners2.get(it).equals(p0)) {
    117. event.setCancelled(false);
    118. itemOwners2.remove(it);
    119. if (itemOwners3.containsKey(it)) {
    120. itemOwners3.remove(it);
    121. }
    122. }
    123. }
    124. }
    125. }
    126. }
    127.  
    128. if (items1 != null) {
    129. for (ItemStack it : items1) {
    130. if (event.getItem().getItemStack().isSimilar(it)) {
    131. if (itemOwners3.containsKey(it)) {
    132. if (itemOwners3.get(it).equals(p0)) {
    133. event.setCancelled(false);
    134. itemOwners3.remove(it);
    135. if (itemOwners2.containsKey(it)) {
    136. itemOwners2.remove(it);
    137. }
    138. }
    139. }
    140. }
    141. }
    142. }
    143. if (!itemz.contains(event.getItem().getItemStack())) {
    144. event.setCancelled(false);
    145. }
    146. }
    147. }
    148.  
    149. public static <T> T[] addToArray(T[] array, T obj) {
    150. ArrayList<T> arrayList = new ArrayList<T>(Arrays.asList(array));
    151. arrayList.add(obj);
    152. return arrayList.toArray(array);
    153. }
    154.  
    155. public static <T> T[] concatArray(T[] first, T[] second) {
    156. T[] result = Arrays.copyOf(first, first.length + second.length);
    157. System.arraycopy(second, 0, result, first.length, second.length);
    158. return result;
    159. }
    160.  
    161. }
    162.  

    It's gonna be a bit confusing to read through this. I just can't simply explain how it works. If you really want to help, please figure out how the plugin works at the moment and then see if you can come up with a sulution.

    Thank you!
     
Thread Status:
Not open for further replies.

Share This Page