Herbalism.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package com.gmail.nossr50.skills;
  2. import java.util.Random;
  3. import org.bukkit.CropState;
  4. import org.bukkit.Location;
  5. import org.bukkit.Material;
  6. import org.bukkit.block.Block;
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.event.block.BlockBreakEvent;
  9. import org.bukkit.inventory.ItemStack;
  10. import org.bukkit.inventory.PlayerInventory;
  11. import com.gmail.nossr50.mcMMO;
  12. import com.gmail.nossr50.config.Config;
  13. import com.gmail.nossr50.datatypes.AbilityType;
  14. import com.gmail.nossr50.datatypes.PlayerProfile;
  15. import com.gmail.nossr50.datatypes.SkillType;
  16. import com.gmail.nossr50.locale.LocaleLoader;
  17. import com.gmail.nossr50.runnables.GreenThumbTimer;
  18. import com.gmail.nossr50.util.Misc;
  19. import com.gmail.nossr50.util.Permissions;
  20. import com.gmail.nossr50.util.Users;
  21. public class Herbalism {
  22. private static Random random = new Random();
  23. /**
  24. * Activate the Green Terra ability.
  25. *
  26. * @param player The player activating the ability
  27. * @param block The block to be changed by Green Terra
  28. */
  29. public static void greenTerra(Player player, Block block) {
  30. PlayerInventory inventory = player.getInventory();
  31. boolean hasSeeds = inventory.contains(Material.SEEDS);
  32. if (!hasSeeds) {
  33. player.sendMessage("You need more seeds to spread Green Terra"); //TODO: Needs more locale.
  34. }
  35. else if (hasSeeds && !block.getType().equals(Material.WHEAT)) {
  36. inventory.removeItem(new ItemStack(Material.SEEDS));
  37. player.updateInventory();
  38. greenTerraConvert(player, block);
  39. }
  40. }
  41. public static void greenTerraConvert(Player player, Block block) {
  42. Material type = block.getType();
  43. if (Misc.blockBreakSimulate(block, player, false)) {
  44. if (Config.getInstance().getHerbalismGreenThumbSmoothbrickToMossy() && type.equals(Material.SMOOTH_BRICK)) {
  45. block.setData((byte) 0x1); //Set type of the brick to mossy
  46. }
  47. else if (Config.getInstance().getHerbalismGreenThumbDirtToGrass() && type.equals(Material.DIRT)) {
  48. block.setType(Material.GRASS);
  49. }
  50. else if (Config.getInstance().getHerbalismGreenThumbCobbleToMossy() && type.equals(Material.COBBLESTONE)) {
  51. block.setType(Material.MOSSY_COBBLESTONE);
  52. }
  53. }
  54. }
  55. /**
  56. * Check for extra Herbalism drops.
  57. *
  58. * @param block The block to check for extra drops
  59. * @param player The player getting extra drops
  60. * @param event The event to use for Green Thumb
  61. * @param plugin mcMMO plugin instance
  62. */
  63. public static void herbalismProcCheck(final Block block, Player player, BlockBreakEvent event, mcMMO plugin) {
  64. final PlayerProfile PP = Users.getProfile(player);
  65. final int MAX_BONUS_LEVEL = 1000;
  66. int herbLevel = PP.getSkillLevel(SkillType.HERBALISM);
  67. int id = block.getTypeId();
  68. Material type = block.getType();
  69. Byte data = block.getData();
  70. Location loc = block.getLocation();
  71. Material mat = null;
  72. int xp = 0;
  73. int catciDrops = 0;
  74. int caneDrops = 0;
  75. switch (type) {
  76. case BROWN_MUSHROOM:
  77. case RED_MUSHROOM:
  78. if (!block.hasMetadata("mcmmoPlacedBlock")) {
  79. mat = Material.getMaterial(id);
  80. xp = Config.getInstance().getHerbalismXPMushrooms();
  81. }
  82. break;
  83. case CACTUS:
  84. for (int y = 0; y <= 2; y++) {
  85. Block b = block.getRelative(0, y, 0);
  86. if (b.getType().equals(Material.CACTUS)) {
  87. mat = Material.CACTUS;
  88. if (!b.hasMetadata("mcmmoPlacedBlock")) {
  89. if (herbLevel > MAX_BONUS_LEVEL || random.nextInt(1000) <= herbLevel) {
  90. catciDrops++;
  91. }
  92. xp += Config.getInstance().getHerbalismXPCactus();
  93. }
  94. }
  95. }
  96. break;
  97. case CROPS:
  98. if (data == CropState.RIPE.getData()) {
  99. mat = Material.WHEAT;
  100. xp = Config.getInstance().getHerbalismXPWheat();
  101. if (Permissions.getInstance().greenThumbWheat(player)) {
  102. greenThumbWheat(block, player, event, plugin);
  103. }
  104. }
  105. break;
  106. case MELON_BLOCK:
  107. if (!block.hasMetadata("mcmmoPlacedBlock")) {
  108. mat = Material.MELON;
  109. xp = Config.getInstance().getHerbalismXPMelon();
  110. }
  111. break;
  112. case NETHER_WARTS:
  113. if (data == (byte) 0x3) {
  114. mat = Material.NETHER_STALK;
  115. xp = Config.getInstance().getHerbalismXPNetherWart();
  116. }
  117. break;
  118. case PUMPKIN:
  119. case JACK_O_LANTERN:
  120. if (!block.hasMetadata("mcmmoPlacedBlock")) {
  121. mat = Material.getMaterial(id);
  122. xp = Config.getInstance().getHerbalismXPPumpkin();
  123. }
  124. break;
  125. case RED_ROSE:
  126. case YELLOW_FLOWER:
  127. if (!block.hasMetadata("mcmmoPlacedBlock")) {
  128. mat = Material.getMaterial(id);
  129. xp = Config.getInstance().getHerbalismXPFlowers();
  130. }
  131. break;
  132. case SUGAR_CANE_BLOCK:
  133. for (int y = 0; y <= 2; y++) {
  134. Block b = block.getRelative(0, y, 0);
  135. if (b.getType().equals(Material.SUGAR_CANE_BLOCK)) {
  136. mat = Material.SUGAR_CANE;
  137. if (!b.hasMetadata("mcmmoPlacedBlock")) {
  138. if (herbLevel > MAX_BONUS_LEVEL || random.nextInt(1000) <= herbLevel) {
  139. caneDrops++;
  140. }
  141. xp += Config.getInstance().getHerbalismXPSugarCane();
  142. }
  143. }
  144. }
  145. break;
  146. case VINE:
  147. if (!block.hasMetadata("mcmmoPlacedBlock")) {
  148. mat = type;
  149. xp = Config.getInstance().getHerbalismXPVines();
  150. }
  151. break;
  152. case WATER_LILY:
  153. if (!block.hasMetadata("mcmmoPlacedBlock")) {
  154. mat = type;
  155. xp = Config.getInstance().getHerbalismXPLilyPads();
  156. }
  157. break;
  158. default:
  159. break;
  160. }
  161. if (mat == null) {
  162. return;
  163. }
  164. if (Permissions.getInstance().herbalismDoubleDrops(player)) {
  165. ItemStack is = new ItemStack(mat);
  166. if (herbLevel > MAX_BONUS_LEVEL || random.nextInt(1000) <= herbLevel) {
  167. Config configInstance = Config.getInstance();
  168. switch (type) {
  169. case BROWN_MUSHROOM:
  170. if (configInstance.getBrownMushroomsDoubleDropsEnabled()) {
  171. Misc.mcDropItem(loc, is);
  172. }
  173. break;
  174. case CACTUS:
  175. if (configInstance.getCactiDoubleDropsEnabled()) {
  176. Misc.mcDropItems(loc, is, catciDrops);
  177. }
  178. break;
  179. case CROPS:
  180. if (configInstance.getWheatDoubleDropsEnabled()) {
  181. Misc.mcDropItem(loc, is);
  182. }
  183. break;
  184. case MELON_BLOCK:
  185. if (configInstance.getMelonsDoubleDropsEnabled()) {
  186. Misc.mcDropItems(loc, is, 3);
  187. Misc.mcRandomDropItems(loc, is, 50, 4);
  188. }
  189. break;
  190. case NETHER_WARTS:
  191. if (configInstance.getNetherWartsDoubleDropsEnabled()) {
  192. Misc.mcDropItems(loc, is, 2);
  193. Misc.mcRandomDropItems(loc, is, 50, 3);
  194. }
  195. break;
  196. case PUMPKIN:
  197. if (configInstance.getPumpkinsDoubleDropsEnabled()) {
  198. Misc.mcDropItem(loc, is);
  199. }
  200. break;
  201. case RED_MUSHROOM:
  202. if (configInstance.getRedMushroomsDoubleDropsEnabled()) {
  203. Misc.mcDropItem(loc, is);
  204. }
  205. break;
  206. case SUGAR_CANE_BLOCK:
  207. if (configInstance.getSugarCaneDoubleDropsEnabled()) {
  208. Misc.mcDropItems(loc, is, caneDrops);
  209. }
  210. break;
  211. case VINE:
  212. if (configInstance.getVinesDoubleDropsEnabled()) {
  213. Misc.mcDropItem(loc, is);
  214. }
  215. break;
  216. case WATER_LILY:
  217. if (configInstance.getWaterLiliesDoubleDropsEnabled()) {
  218. Misc.mcDropItem(loc, is);
  219. }
  220. break;
  221. case YELLOW_FLOWER:
  222. if (configInstance.getYellowFlowersDoubleDropsEnabled()) {
  223. Misc.mcDropItem(loc, is);
  224. }
  225. break;
  226. default:
  227. break;
  228. }
  229. }
  230. }
  231. PP.addXP(SkillType.HERBALISM, xp);
  232. Skills.XpCheckSkill(SkillType.HERBALISM, player);
  233. }
  234. /**
  235. * Apply the Green Thumb ability to crops.
  236. *
  237. * @param block The block to apply the ability to
  238. * @param player The player using the ability
  239. * @param event The event triggering the ability
  240. * @param plugin mcMMO plugin instance
  241. */
  242. private static void greenThumbWheat(Block block, Player player, BlockBreakEvent event, mcMMO plugin) {
  243. final int MAX_BONUS_LEVEL = 1500;
  244. PlayerProfile PP = Users.getProfile(player);
  245. int herbLevel = PP.getSkillLevel(SkillType.HERBALISM);
  246. PlayerInventory inventory = player.getInventory();
  247. boolean hasSeeds = inventory.contains(Material.SEEDS);
  248. Location loc = block.getLocation();
  249. if (hasSeeds && PP.getAbilityMode(AbilityType.GREEN_TERRA) || hasSeeds && (herbLevel > MAX_BONUS_LEVEL || random.nextInt(1500) <= herbLevel)) {
  250. event.setCancelled(true);
  251. Misc.mcDropItem(loc, new ItemStack(Material.WHEAT));
  252. Misc.mcRandomDropItems(loc, new ItemStack(Material.SEEDS), 50, 3);
  253. plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new GreenThumbTimer(block, PP), 1);
  254. inventory.removeItem(new ItemStack(Material.SEEDS));
  255. player.updateInventory();
  256. }
  257. }
  258. /**
  259. * Apply the Green Thumb ability to blocks.
  260. *
  261. * @param is The item in the player's hand
  262. * @param player The player activating the ability
  263. * @param block The block being used in the ability
  264. */
  265. public static void greenThumbBlocks(ItemStack is, Player player, Block block) {
  266. final int MAX_BONUS_LEVEL = 1500;
  267. PlayerProfile PP = Users.getProfile(player);
  268. int skillLevel = PP.getSkillLevel(SkillType.HERBALISM);
  269. int seeds = is.getAmount();
  270. player.setItemInHand(new ItemStack(Material.SEEDS, seeds - 1));
  271. if (skillLevel > MAX_BONUS_LEVEL || random.nextInt(1500) <= skillLevel) {
  272. greenTerraConvert(player, block);
  273. }
  274. else {
  275. player.sendMessage(LocaleLoader.getString("mcPlayerListener.GreenThumbFail"));
  276. }
  277. }
  278. }