added fortune and infinity for hoe
All checks were successful
Gitea Actions Demo / Build-Gradle (push) Successful in 3m14s
All checks were successful
Gitea Actions Demo / Build-Gradle (push) Successful in 3m14s
This commit is contained in:
Binary file not shown.
@@ -1,2 +1,2 @@
|
|||||||
Command: /opt/homebrew/Cellar/openjdk/23.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -Xmx1G -classpath /Users/janik/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.11.1/6c1f29838864ba8f495855edfc8ef17706fedb5d/tiny-remapper-0.11.1-fat.jar net.fabricmc.tinyremapper.Main /Users/janik/Desktop/MCPlugins/environmentex-1.0-SNAPSHOT.jar /Users/janik/Desktop/MCPlugins/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/reobfMappings.tiny mojang spigot /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/mappedServerJar.jar --threads=1
|
Command: /opt/homebrew/Cellar/openjdk/23.0.2/libexec/openjdk.jdk/Contents/Home/bin/java -Xmx1G -classpath /Users/janik/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.11.1/6c1f29838864ba8f495855edfc8ef17706fedb5d/tiny-remapper-0.11.1-fat.jar net.fabricmc.tinyremapper.Main /Users/janik/Desktop/MCPlugins/environmentex-1.0-SNAPSHOT.jar /Users/janik/Desktop/MCPlugins/environmentex/build/libs/environmentex-1.0-SNAPSHOT-reobf.jar /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/reobfMappings.tiny mojang spigot /Users/janik/Desktop/MCPlugins/environmentex/.gradle/caches/paperweight/taskCache/mappedServerJar.jar --threads=1
|
||||||
[INFO] Finished after 998,05 ms.
|
[INFO] Finished after 880,98 ms.
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -6,8 +6,6 @@ import org.bukkit.Location;
|
|||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.plugin.PluginManager;
|
import org.bukkit.plugin.PluginManager;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
|
||||||
|
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
@@ -15,9 +13,7 @@ import org.bukkit.World;
|
|||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.inventory.InventoryType;
|
import org.bukkit.event.inventory.InventoryType;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.Recipe;
|
import org.bukkit.inventory.Recipe;
|
||||||
@@ -463,6 +459,7 @@ public class App extends JavaPlugin {
|
|||||||
pM.registerEvents(new PinFeature(), this);
|
pM.registerEvents(new PinFeature(), this);
|
||||||
pM.registerEvents(new SquidPrevention(), this);
|
pM.registerEvents(new SquidPrevention(), this);
|
||||||
pM.registerEvents(new EntityMuter(), this);
|
pM.registerEvents(new EntityMuter(), this);
|
||||||
|
pM.registerEvents(new BetterHoes(), this);
|
||||||
getCommand("test").setExecutor(new EnvironmentExCommands());
|
getCommand("test").setExecutor(new EnvironmentExCommands());
|
||||||
getCommand("y").setExecutor(new EnvironmentExCommands());
|
getCommand("y").setExecutor(new EnvironmentExCommands());
|
||||||
getCommand("n").setExecutor(new EnvironmentExCommands());
|
getCommand("n").setExecutor(new EnvironmentExCommands());
|
||||||
|
|||||||
@@ -0,0 +1,253 @@
|
|||||||
|
package de.hessj.environmentex;
|
||||||
|
|
||||||
|
import org.bukkit.*;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.Ageable;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.entity.EntityInteractEvent;
|
||||||
|
import org.bukkit.event.inventory.PrepareAnvilEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.inventory.AnvilInventory;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.meta.Damageable;
|
||||||
|
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.bukkit.inventory.view.AnvilView;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
|
import io.netty.util.internal.ThreadLocalRandom;
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class BetterHoes implements Listener {
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onAnvilPrepare(PrepareAnvilEvent event) {
|
||||||
|
AnvilInventory inv = event.getInventory();
|
||||||
|
AnvilView av = event.getView();
|
||||||
|
ItemStack left = inv.getItem(0);
|
||||||
|
ItemStack right = inv.getItem(1);
|
||||||
|
|
||||||
|
if (left == null || right == null) return;
|
||||||
|
if (!left.getType().name().endsWith("_HOE")) return;
|
||||||
|
if (right.getType() != Material.ENCHANTED_BOOK) return;
|
||||||
|
|
||||||
|
if (!(right.getItemMeta() instanceof EnchantmentStorageMeta bookMeta)) return;
|
||||||
|
if (!bookMeta.hasStoredEnchant(Enchantment.INFINITY)) return;
|
||||||
|
|
||||||
|
// Create the new hoe with Infinity
|
||||||
|
ItemStack result = left.clone();
|
||||||
|
result.addUnsafeEnchantment(Enchantment.INFINITY, 1);
|
||||||
|
event.setResult(result);
|
||||||
|
|
||||||
|
// Set repair cost using the view (modern API)
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
av.setRepairCost(6);
|
||||||
|
}
|
||||||
|
}.runTaskLater(App.main, 1L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasInfinity(ItemStack item) {
|
||||||
|
if (item == null || !item.hasItemMeta())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ItemMeta meta = item.getItemMeta();
|
||||||
|
return meta.hasEnchant(Enchantment.INFINITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Set<Material> HARVESTABLE_CROPS = EnumSet.of(
|
||||||
|
Material.WHEAT,
|
||||||
|
Material.CARROTS,
|
||||||
|
Material.POTATOES,
|
||||||
|
Material.BEETROOTS);
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerStepFarmland(PlayerInteractEvent event) {
|
||||||
|
if (event.getAction() == Action.PHYSICAL && event.getClickedBlock() != null &&
|
||||||
|
event.getClickedBlock().getType() == Material.FARMLAND) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onEntityStepFarmland(EntityInteractEvent event) {
|
||||||
|
if (event.getEntityType() != EntityType.PLAYER &&
|
||||||
|
event.getBlock() != null && event.getBlock().getType() == Material.FARMLAND) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onHoeHarvest(PlayerInteractEvent event) {
|
||||||
|
if (event.getAction() != Action.LEFT_CLICK_BLOCK || event.getClickedBlock() == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Block clicked = event.getClickedBlock();
|
||||||
|
Material type = clicked.getType();
|
||||||
|
if (!HARVESTABLE_CROPS.contains(type))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ItemStack tool = event.getPlayer().getInventory().getItemInMainHand();
|
||||||
|
if (tool == null || !tool.getType().name().endsWith("_HOE"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
int radius = switch (tool.getType()) {
|
||||||
|
case IRON_HOE -> 1;
|
||||||
|
case GOLDEN_HOE -> 2;
|
||||||
|
case DIAMOND_HOE -> 3;
|
||||||
|
case NETHERITE_HOE -> 4;
|
||||||
|
default -> 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
harvest(event, clicked, radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void harvest(PlayerInteractEvent event, Block center, int radius) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
PlayerInventoryHelper helper = new PlayerInventoryHelper(event.getPlayer());
|
||||||
|
|
||||||
|
if (radius > 0) {
|
||||||
|
event.getPlayer().spawnParticle(Particle.SWEEP_ATTACK,
|
||||||
|
event.getPlayer().getEyeLocation()
|
||||||
|
.add(event.getPlayer().getLocation().getDirection().multiply(1.5)),
|
||||||
|
1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int dx = -radius; dx <= radius; dx++) {
|
||||||
|
for (int dy = -radius; dy <= radius; dy++) {
|
||||||
|
for (int dz = -radius; dz <= radius; dz++) {
|
||||||
|
Block target = center.getRelative(dx, dy, dz);
|
||||||
|
tryHarvestCrop(event, target, helper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also process the center block last to guarantee it runs even with radius 0
|
||||||
|
tryHarvestCrop(event, center, helper);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void tryHarvestCrop(PlayerInteractEvent event, Block block, PlayerInventoryHelper helper) {
|
||||||
|
BlockData data = block.getBlockData();
|
||||||
|
if (!(data instanceof Ageable ageable))
|
||||||
|
return;
|
||||||
|
if (ageable.getAge() < ageable.getMaximumAge())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Material cropType = block.getType();
|
||||||
|
if (!HARVESTABLE_CROPS.contains(cropType))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!helper.hasDurability()) {
|
||||||
|
helper.breakTool();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
block.setType(Material.AIR);
|
||||||
|
helper.damageTool(toolDamageChance(helper.getTool().getType()));
|
||||||
|
// block.getWorld().dropItemNaturally(block.getLocation(), getCropDrop(cropType));
|
||||||
|
dropCrop(cropType, block.getLocation(), helper.getTool());
|
||||||
|
if (hasInfinity(helper.getTool())) {
|
||||||
|
block.setType(cropType); // reset crop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dropCrop(Material cropType, Location location, ItemStack tool) {
|
||||||
|
World world = location.getWorld();
|
||||||
|
ThreadLocalRandom random = ThreadLocalRandom.current();
|
||||||
|
|
||||||
|
int fortuneLevel = 0;
|
||||||
|
if (tool != null && tool.containsEnchantment(Enchantment.FORTUNE)) {
|
||||||
|
fortuneLevel = tool.getEnchantmentLevel(Enchantment.FORTUNE);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cropType) {
|
||||||
|
case WHEAT -> {
|
||||||
|
world.dropItemNaturally(location, new ItemStack(Material.WHEAT));
|
||||||
|
int seedCount = 1 + random.nextInt(3); // vanilla: 0–3 seeds (simplified)
|
||||||
|
world.dropItemNaturally(location, new ItemStack(Material.WHEAT_SEEDS, seedCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
case CARROTS -> {
|
||||||
|
int base = 1;
|
||||||
|
int extra = random.nextInt(fortuneLevel + 2); // fortune increases upper bound
|
||||||
|
int total = base + extra;
|
||||||
|
world.dropItemNaturally(location, new ItemStack(Material.CARROT, total));
|
||||||
|
}
|
||||||
|
|
||||||
|
case POTATOES -> {
|
||||||
|
int base = 1;
|
||||||
|
int extra = random.nextInt(fortuneLevel + 2);
|
||||||
|
int total = base + extra;
|
||||||
|
world.dropItemNaturally(location, new ItemStack(Material.POTATO, total));
|
||||||
|
|
||||||
|
// Slightly increase chance of poisonous potato with Fortune
|
||||||
|
double poisonChance = 0.02 + (0.005 * fortuneLevel);
|
||||||
|
if (random.nextDouble() < poisonChance) {
|
||||||
|
world.dropItemNaturally(location, new ItemStack(Material.POISONOUS_POTATO));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case BEETROOTS -> {
|
||||||
|
world.dropItemNaturally(location, new ItemStack(Material.BEETROOT));
|
||||||
|
int seedCount = 1 + random.nextInt(3);
|
||||||
|
world.dropItemNaturally(location, new ItemStack(Material.BEETROOT_SEEDS, seedCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
default -> {
|
||||||
|
// No valid crop — optional: log or ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int toolDamageChance(Material toolType) {
|
||||||
|
double chance = switch (toolType) {
|
||||||
|
case WOODEN_HOE -> 0.70;
|
||||||
|
case STONE_HOE -> 0.75;
|
||||||
|
case IRON_HOE -> 0.80;
|
||||||
|
case GOLDEN_HOE -> 0.85;
|
||||||
|
case DIAMOND_HOE -> 0.90;
|
||||||
|
case NETHERITE_HOE -> 0.95;
|
||||||
|
default -> 0.70;
|
||||||
|
};
|
||||||
|
return new Random().nextDouble() < chance ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper class for handling tool durability and inventory safely
|
||||||
|
static class PlayerInventoryHelper {
|
||||||
|
private final org.bukkit.entity.Player player;
|
||||||
|
private final ItemStack tool;
|
||||||
|
private final Damageable meta;
|
||||||
|
|
||||||
|
public PlayerInventoryHelper(org.bukkit.entity.Player player) {
|
||||||
|
this.player = player;
|
||||||
|
this.tool = player.getInventory().getItemInMainHand();
|
||||||
|
this.meta = (Damageable) tool.getItemMeta();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack getTool() {
|
||||||
|
return tool;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasDurability() {
|
||||||
|
return meta.getDamage() < tool.getType().getMaxDurability();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void damageTool(int amount) {
|
||||||
|
meta.setDamage(meta.getDamage() + amount);
|
||||||
|
tool.setItemMeta(meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void breakTool() {
|
||||||
|
player.getInventory().clear(player.getInventory().getHeldItemSlot());
|
||||||
|
player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package de.hessj.environmentex;
|
||||||
|
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.entity.EntityTargetEvent;
|
||||||
|
|
||||||
|
public class EntityMuter implements Listener {
|
||||||
|
@EventHandler
|
||||||
|
public void onEntitySound(EntityTargetEvent event) {
|
||||||
|
if (event.getEntity().getType() != EntityType.ZOMBIE && event.getTarget() != null && event.getTarget().getType() != EntityType.VILLAGER) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (event.getEntity().customName() != null) {
|
||||||
|
if (event.getEntity().customName().toString().contains("muted")) {
|
||||||
|
event.getEntity().setSilent(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package de.hessj.environmentex;
|
package de.hessj.environmentex;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@@ -13,20 +12,15 @@ import java.util.UUID;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Particle;
|
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.SoundCategory;
|
import org.bukkit.SoundCategory;
|
||||||
import org.bukkit.Statistic;
|
import org.bukkit.Statistic;
|
||||||
import org.bukkit.Tag;
|
import org.bukkit.Tag;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.data.Ageable;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
|
||||||
import org.bukkit.block.data.type.Fence;
|
import org.bukkit.block.data.type.Fence;
|
||||||
import org.bukkit.block.data.type.Leaves;
|
import org.bukkit.block.data.type.Leaves;
|
||||||
import org.bukkit.block.data.type.Stairs;
|
import org.bukkit.block.data.type.Stairs;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.entity.Axolotl;
|
import org.bukkit.entity.Axolotl;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Fish;
|
import org.bukkit.entity.Fish;
|
||||||
@@ -42,7 +36,6 @@ import org.bukkit.event.block.Action;
|
|||||||
import org.bukkit.event.block.BlockBreakEvent;
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
import org.bukkit.event.block.LeavesDecayEvent;
|
import org.bukkit.event.block.LeavesDecayEvent;
|
||||||
import org.bukkit.event.entity.EntityDeathEvent;
|
import org.bukkit.event.entity.EntityDeathEvent;
|
||||||
import org.bukkit.event.entity.EntityInteractEvent;
|
|
||||||
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
|
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
|
||||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
@@ -57,12 +50,9 @@ import org.bukkit.event.inventory.PrepareItemCraftEvent;
|
|||||||
import org.bukkit.event.player.PlayerAttemptPickupItemEvent;
|
import org.bukkit.event.player.PlayerAttemptPickupItemEvent;
|
||||||
import org.bukkit.event.player.PlayerBedEnterEvent;
|
import org.bukkit.event.player.PlayerBedEnterEvent;
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
import org.bukkit.util.Vector;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.MerchantRecipe;
|
import org.bukkit.inventory.MerchantRecipe;
|
||||||
import org.bukkit.inventory.meta.Damageable;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
import org.bukkit.persistence.PersistentDataType;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import de.hessj.helper.Helper;
|
import de.hessj.helper.Helper;
|
||||||
@@ -267,197 +257,6 @@ if(LoginListener.customConfig.getBoolean("players." + p.getUniqueId() + ".ignore
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void soilChangePlayer(PlayerInteractEvent event) {
|
|
||||||
if (event.getAction() == Action.PHYSICAL && event.getClickedBlock().getType() == Material.FARMLAND) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void soilChangeEntity(EntityInteractEvent event) {
|
|
||||||
if (event.getEntityType() != EntityType.PLAYER && event.getBlock().getType() == Material.FARMLAND) {
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onClick(PlayerInteractEvent e) {
|
|
||||||
if (e.getAction() == Action.LEFT_CLICK_BLOCK
|
|
||||||
&& (e.getClickedBlock().getType() == Material.WHEAT || e.getClickedBlock().getType() == Material.CARROTS
|
|
||||||
|| e.getClickedBlock().getType() == Material.ATTACHED_MELON_STEM
|
|
||||||
|| e.getClickedBlock().getType() == Material.MELON_STEM
|
|
||||||
|| e.getClickedBlock().getType() == Material.ATTACHED_PUMPKIN_STEM
|
|
||||||
|| e.getClickedBlock().getType() == Material.PUMPKIN_STEM
|
|
||||||
|| e.getClickedBlock().getType() == Material.POTATOES
|
|
||||||
|| e.getClickedBlock().getType() == Material.BEETROOTS)) {
|
|
||||||
if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.WOODEN_HOE)) {
|
|
||||||
harvest(0, e);
|
|
||||||
} else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.STONE_HOE)) {
|
|
||||||
harvest(0, e);
|
|
||||||
} else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.IRON_HOE)) {
|
|
||||||
harvest(1, e);
|
|
||||||
} else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.GOLDEN_HOE)) {
|
|
||||||
harvest(2, e);
|
|
||||||
} else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.DIAMOND_HOE)) {
|
|
||||||
harvest(3, e);
|
|
||||||
} else if (e.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NETHERITE_HOE)) {
|
|
||||||
harvest(4, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int harvestDMG(Material weapon) {
|
|
||||||
|
|
||||||
double perc = 0.70;
|
|
||||||
|
|
||||||
if (weapon == Material.WOODEN_HOE) {
|
|
||||||
perc = 0.70;
|
|
||||||
} else if (weapon == Material.STONE_HOE) {
|
|
||||||
perc = 0.75;
|
|
||||||
} else if (weapon == Material.IRON_HOE) {
|
|
||||||
perc = 0.80;
|
|
||||||
} else if (weapon == Material.GOLDEN_HOE) {
|
|
||||||
perc = 0.85;
|
|
||||||
} else if (weapon == Material.DIAMOND_HOE) {
|
|
||||||
perc = 0.90;
|
|
||||||
} else if (weapon == Material.NETHERITE_HOE) {
|
|
||||||
perc = 0.95;
|
|
||||||
}
|
|
||||||
|
|
||||||
Random rand = new Random();
|
|
||||||
return (rand.nextDouble() < perc) ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void harvest(int radius, PlayerInteractEvent e) {
|
|
||||||
e.setCancelled(true);
|
|
||||||
Block middle = e.getClickedBlock();
|
|
||||||
Material cropM = middle.getType();
|
|
||||||
|
|
||||||
ItemStack isCropM;
|
|
||||||
switch (cropM) {
|
|
||||||
case POTATOES:
|
|
||||||
isCropM = new ItemStack(Material.POTATO, 1);
|
|
||||||
break;
|
|
||||||
case BEETROOTS:
|
|
||||||
isCropM = new ItemStack(Material.BEETROOT, 1);
|
|
||||||
break;
|
|
||||||
case WHEAT:
|
|
||||||
isCropM = new ItemStack(Material.WHEAT, 1);
|
|
||||||
break;
|
|
||||||
case CARROTS:
|
|
||||||
isCropM = new ItemStack(Material.CARROT, 1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
isCropM = new ItemStack(Material.AIR, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
if (middle.getBlockData() instanceof Ageable) {
|
|
||||||
Ageable ab = (Ageable) middle.getBlockData();
|
|
||||||
if (ab.getAge() == ab.getMaximumAge()) {
|
|
||||||
if (e.getPlayer().getInventory().getItemInMainHand() != null
|
|
||||||
&& ((Damageable) e.getPlayer().getInventory().getItemInMainHand().getItemMeta())
|
|
||||||
.getDamage() <= e
|
|
||||||
.getPlayer().getInventory().getItemInMainHand().getType().getMaxDurability()) {
|
|
||||||
if (cropM != Material.PUMPKIN_STEM && cropM != Material.MELON_STEM) {
|
|
||||||
middle.setType(Material.AIR);
|
|
||||||
Bukkit.getWorlds().get(0).dropItem(middle.getLocation(), isCropM);
|
|
||||||
|
|
||||||
ItemStack is = e.getPlayer().getInventory().getItemInMainHand();
|
|
||||||
ItemMeta meta = is.getItemMeta();
|
|
||||||
Damageable d = (Damageable) meta;
|
|
||||||
d.setDamage(d.getDamage() + harvestDMG(is.getType()));
|
|
||||||
is.setItemMeta(meta);
|
|
||||||
middle.setType(cropM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (e.getPlayer().getInventory().getItemInMainHand() != null
|
|
||||||
&& ((Damageable) e.getPlayer().getInventory().getItemInMainHand().getItemMeta())
|
|
||||||
.getDamage() >= e
|
|
||||||
.getPlayer().getInventory().getItemInMainHand().getType().getMaxDurability()) {
|
|
||||||
e.getPlayer().getInventory().clear(e.getPlayer().getInventory().getHeldItemSlot());
|
|
||||||
e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (radius != 0) {
|
|
||||||
Vector direction = e.getPlayer().getLocation().getDirection();
|
|
||||||
Location location = e.getPlayer().getEyeLocation();
|
|
||||||
location.add(direction.multiply(1.5D));
|
|
||||||
e.getPlayer().getWorld().spawnParticle(Particle.SWEEP_ATTACK, location, 1);
|
|
||||||
|
|
||||||
for (int x = radius; x >= -radius; x--) {
|
|
||||||
for (int y = radius; y >= -radius; y--) {
|
|
||||||
for (int z = radius; z >= -radius; z--) {
|
|
||||||
BlockData bd = (BlockData) middle.getRelative(x, y, z).getBlockData();
|
|
||||||
if (bd instanceof Ageable) {
|
|
||||||
Ageable abR = (Ageable) bd;
|
|
||||||
if (abR.getAge() == abR.getMaximumAge()) {
|
|
||||||
try {
|
|
||||||
if (e.getPlayer().getInventory().getItemInMainHand() != null
|
|
||||||
&& ((Damageable) e.getPlayer().getInventory().getItemInMainHand()
|
|
||||||
.getItemMeta()).getDamage() <= e.getPlayer().getInventory()
|
|
||||||
.getItemInMainHand().getType().getMaxDurability()) {
|
|
||||||
Material crop = middle.getRelative(x, y, z).getType();
|
|
||||||
|
|
||||||
Location loc = middle.getRelative(x, y, z).getLocation();
|
|
||||||
|
|
||||||
ItemStack isCrop;
|
|
||||||
|
|
||||||
switch (crop) {
|
|
||||||
case POTATOES:
|
|
||||||
isCrop = new ItemStack(Material.POTATO, 1);
|
|
||||||
break;
|
|
||||||
case BEETROOTS:
|
|
||||||
isCrop = new ItemStack(Material.BEETROOT, 1);
|
|
||||||
break;
|
|
||||||
case WHEAT:
|
|
||||||
isCrop = new ItemStack(Material.WHEAT, 1);
|
|
||||||
break;
|
|
||||||
case CARROTS:
|
|
||||||
isCrop = new ItemStack(Material.CARROT, 1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
isCrop = new ItemStack(Material.AIR, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// middle.getRelative(x, y, z).breakNaturally(new ItemStack(Material.AIR));
|
|
||||||
if (crop != Material.PUMPKIN_STEM && crop != Material.MELON_STEM) {
|
|
||||||
middle.getRelative(x, y, z).setType(Material.AIR);
|
|
||||||
Bukkit.getWorlds().get(0).dropItem(loc, isCrop);
|
|
||||||
|
|
||||||
middle.getRelative(x, y, z).setType(crop);
|
|
||||||
|
|
||||||
ItemStack is = e.getPlayer().getInventory().getItemInMainHand();
|
|
||||||
ItemMeta meta = is.getItemMeta();
|
|
||||||
Damageable d = (Damageable) meta;
|
|
||||||
d.setDamage(d.getDamage() + harvestDMG(is.getType()));
|
|
||||||
is.setItemMeta(meta);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (e.getPlayer().getInventory().getItemInMainHand() != null
|
|
||||||
&& ((Damageable) e.getPlayer().getInventory().getItemInMainHand()
|
|
||||||
.getItemMeta()).getDamage() >= e.getPlayer().getInventory()
|
|
||||||
.getItemInMainHand().getType().getMaxDurability()) {
|
|
||||||
e.getPlayer().getInventory()
|
|
||||||
.clear(e.getPlayer().getInventory().getHeldItemSlot());
|
|
||||||
e.getPlayer().playSound(e.getPlayer().getLocation(), Sound.ENTITY_ITEM_BREAK, 1,
|
|
||||||
1);
|
|
||||||
}
|
|
||||||
} catch (NullPointerException ex) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private long breakDelay = 5;
|
private long breakDelay = 5;
|
||||||
private long decayDelay = 2;
|
private long decayDelay = 2;
|
||||||
private boolean spawnParticles = true;
|
private boolean spawnParticles = true;
|
||||||
@@ -725,7 +524,7 @@ if(LoginListener.customConfig.getBoolean("players." + p.getUniqueId() + ".ignore
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ItemStack is = e.getPlayer().getInventory().getItemInOffHand();
|
// ItemStack is = e.getPlayer().getInventory().getItemInOffHand();
|
||||||
if (e.getPlayer().getInventory().getItemInMainHand() != null
|
if (e.getPlayer().getInventory().getItemInMainHand() != null
|
||||||
&& e.getPlayer().getInventory().getItemInMainHand().getItemMeta() != null) {
|
&& e.getPlayer().getInventory().getItemInMainHand().getItemMeta() != null) {
|
||||||
if (e.getPlayer().getInventory().getItemInMainHand().getItemMeta().getPersistentDataContainer()
|
if (e.getPlayer().getInventory().getItemInMainHand().getItemMeta().getPersistentDataContainer()
|
||||||
|
|||||||
Reference in New Issue
Block a user