ScriptHelper.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package me.km.snuviscript;
  2. import me.km.exception.IllegalItemStackStringException;
  3. import me.hammerle.code.ScriptUtils;
  4. import me.km.utils.ItemStackUtils;
  5. import net.minecraft.block.Block;
  6. import net.minecraft.item.Item;
  7. import net.minecraft.item.ItemStack;
  8. public class ScriptHelper
  9. {
  10. public static Item getItem(String stack) throws IllegalItemStackStringException
  11. {
  12. Item item = Item.getByNameOrId(stack);
  13. if(item == null)
  14. {
  15. Block b = Block.getBlockFromName(stack);
  16. if(b == null)
  17. {
  18. throw new IllegalItemStackStringException(stack);
  19. }
  20. return Item.getItemFromBlock(b);
  21. }
  22. return item;
  23. }
  24. /** Gibt einen ItemStack zurück
  25. * @param stack ein ItemStack-String im Format "Material", "Material:DV" oder "Material:DV:Amount"
  26. * @throws IllegalItemStackStringException wenn das Format nicht erfüllt ist
  27. * @return den ItemStack
  28. */
  29. private static ItemStack getSimpleItemStack(String stack) throws IllegalItemStackStringException
  30. {
  31. String[] parts = stack.split(":");
  32. if(parts[0].equals("km") || parts[0].equals("minecraft"))
  33. {
  34. if(parts.length <= 1)
  35. {
  36. throw new IllegalItemStackStringException(stack);
  37. }
  38. String[] newParts = new String[parts.length - 1];
  39. newParts[0] = parts[0].toLowerCase() + ":" + parts[1].toLowerCase();
  40. for(int i = 1; i < newParts.length; i++)
  41. {
  42. newParts[i] = parts[i + 1].toLowerCase();
  43. }
  44. parts = newParts;
  45. }
  46. else
  47. {
  48. parts[0] = "minecraft:" + parts[0].toLowerCase();
  49. }
  50. int amount = 1;
  51. int data = 0;
  52. if(parts.length >= 2)
  53. {
  54. try
  55. {
  56. data = Integer.parseInt(parts[1]);
  57. if(data < 0)
  58. {
  59. throw new IllegalItemStackStringException(stack);
  60. }
  61. }
  62. catch(NumberFormatException ex)
  63. {
  64. throw new IllegalItemStackStringException(stack);
  65. }
  66. if(parts.length >= 3)
  67. {
  68. try
  69. {
  70. amount = Integer.parseInt(parts[2]);
  71. if(amount < 1)
  72. {
  73. throw new IllegalItemStackStringException(stack);
  74. }
  75. }
  76. catch(NumberFormatException ex)
  77. {
  78. throw new IllegalItemStackStringException(stack);
  79. }
  80. }
  81. }
  82. return new ItemStack(getItem(parts[0]), amount, data);
  83. }
  84. /** Gibt einen ItemStack zurück
  85. * @param args ein Array der mindestens einen gültigen ItemStack-String enthalten muss.
  86. * Weiters kann auch ein Name und eine Lore mitgegeben werden, andernfalls muss der
  87. * Array vorher an seiner Grenze sein oder null verwendet werden.
  88. * @param start die Stelle, an der der ItemStack beginnt
  89. * @throws IllegalItemStackStringException wenn das Format des ItemStack-Strings nicht erfüllt ist
  90. * @return den ItemStack
  91. */
  92. public static ItemStack getItemStack(Object[] args, int start) throws IllegalItemStackStringException
  93. {
  94. if(args[start].toString().startsWith("{"))
  95. {
  96. return ItemStackUtils.getStackFromNbtString(ScriptUtils.connect(args, " ", start).replace('\'', '"'));
  97. }
  98. ItemStack stack = getSimpleItemStack(args[start].toString());
  99. if(args.length >= start + 2)
  100. {
  101. if(!(args[start + 1] == null))
  102. {
  103. stack.setStackDisplayName(args[start + 1].toString());
  104. }
  105. }
  106. if(args.length >= start + 3)
  107. {
  108. if(!(args[start + 2] == null))
  109. {
  110. for(int i = start + 2; i < args.length; i++)
  111. {
  112. ItemStackUtils.addLore(stack, args[i].toString());
  113. }
  114. }
  115. }
  116. return stack;
  117. }
  118. /** Gibt einen ItemStack-String zurück
  119. * @param stack ein ItemStack
  120. * @return den ItemStack-String im Format "Material:DV:Amount"
  121. */
  122. public static String getItemStackString(ItemStack stack)
  123. {
  124. return ItemStackUtils.getNbtString(stack);
  125. }
  126. }