mirror of
https://github.com/songoda/UltimateStacker.git
synced 2024-11-23 18:45:39 +01:00
Breeding support
This commit is contained in:
parent
8efa264ddf
commit
76ec78023e
@ -11,7 +11,7 @@ public class EntityStack {
|
||||
|
||||
public EntityStack(Entity entity, int amount) {
|
||||
this.entity = entity;
|
||||
this.amount = amount;
|
||||
this.setAmount(amount);
|
||||
}
|
||||
|
||||
public void updateStack() {
|
||||
|
@ -7,13 +7,18 @@ import org.bukkit.Material;
|
||||
import org.bukkit.entity.*;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityBreedEvent;
|
||||
import org.bukkit.event.entity.EntityPickupItemEvent;
|
||||
import org.bukkit.event.inventory.InventoryPickupItemEvent;
|
||||
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class InteractListeners implements Listener {
|
||||
@ -24,6 +29,12 @@ public class InteractListeners implements Listener {
|
||||
this.instance = instance;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onBread(EntityBreedEvent event) {
|
||||
event.getFather().removeMetadata("inLove", instance);
|
||||
event.getMother().removeMetadata("inLove", instance);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onInteract(PlayerInteractAtEntityEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
@ -31,18 +42,19 @@ public class InteractListeners implements Listener {
|
||||
|
||||
ItemStack item = player.getInventory().getItemInHand();
|
||||
|
||||
if (item.getType() != Material.NAME_TAG
|
||||
|| !instance.getEntityStackManager().isStacked(entity)) return;
|
||||
if (!instance.getEntityStackManager().isStacked(entity)) return;
|
||||
|
||||
if (item.getType() != Material.NAME_TAG && !correctFood(item, entity)) return;
|
||||
|
||||
EntityStack stack = instance.getEntityStackManager().getStack(entity);
|
||||
|
||||
if (stack.getAmount() == 1) return;
|
||||
event.setCancelled(true);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> stack.setAmount(stack.getAmount() - 1), 1L);
|
||||
if (item.getType() == Material.NAME_TAG)
|
||||
event.setCancelled(true);
|
||||
|
||||
Entity newEntity = entity.getWorld().spawnEntity(entity.getLocation(), entity.getType());
|
||||
newEntity.setVelocity(getRandomVector());
|
||||
entity.setVelocity(getRandomVector());
|
||||
|
||||
if (entity instanceof Ageable) {
|
||||
if (((Ageable) entity).isAdult()) {
|
||||
@ -62,9 +74,70 @@ public class InteractListeners implements Listener {
|
||||
Villager villager = ((Villager) newEntity);
|
||||
villager.setProfession(villager.getProfession());
|
||||
}
|
||||
newEntity.setCustomName(item.getItemMeta().getDisplayName());
|
||||
|
||||
|
||||
instance.getEntityStackManager().addStack(new EntityStack(newEntity, stack.getAmount() - 1));
|
||||
stack.setAmount(1);
|
||||
instance.getEntityStackManager().removeStack(entity);
|
||||
|
||||
if (item.getType() == Material.NAME_TAG) {
|
||||
entity.setCustomName(item.getItemMeta().getDisplayName());
|
||||
} else {
|
||||
entity.setMetadata("inLove", new FixedMetadataValue(instance, true));
|
||||
|
||||
Bukkit.getScheduler().runTaskLaterAsynchronously(instance, () -> {
|
||||
if (entity.isDead()) return;
|
||||
entity.removeMetadata("inLove", instance);
|
||||
}, 20 * 20);
|
||||
}
|
||||
}
|
||||
|
||||
private Vector getRandomVector() {
|
||||
return new Vector(ThreadLocalRandom.current().nextDouble(-1, 1.01), 0, ThreadLocalRandom.current().nextDouble(-1, 1.01)).normalize().multiply(0.5);
|
||||
}
|
||||
|
||||
private boolean correctFood(ItemStack is, Entity entity) {
|
||||
Material type = is.getType();
|
||||
switch (entity.getType()) {
|
||||
case COW:
|
||||
case SHEEP:
|
||||
return type == Material.WHEAT;
|
||||
case PIG:
|
||||
return (type == Material.CARROT || type == Material.BEETROOT || type == Material.POTATO);
|
||||
case CHICKEN:
|
||||
return type == Material.WHEAT_SEEDS
|
||||
|| type == Material.MELON_SEEDS
|
||||
|| type == Material.BEETROOT_SEEDS
|
||||
|| type == Material.PUMPKIN_SEEDS;
|
||||
case HORSE:
|
||||
return type == Material.GOLDEN_APPLE || type == Material.GOLDEN_CARROT;
|
||||
case WOLF:
|
||||
return type == Material.BEEF
|
||||
|| type == Material.CHICKEN
|
||||
|| type == Material.COD
|
||||
|| type == Material.MUTTON
|
||||
|| type == Material.PORKCHOP
|
||||
|| type == Material.RABBIT
|
||||
|| type == Material.SALMON
|
||||
|| type == Material.COOKED_BEEF
|
||||
|| type == Material.COOKED_CHICKEN
|
||||
|| type == Material.COOKED_COD
|
||||
|| type == Material.COOKED_MUTTON
|
||||
|| type == Material.COOKED_PORKCHOP
|
||||
|| type == Material.COOKED_RABBIT
|
||||
|| type == Material.COOKED_SALMON;
|
||||
case OCELOT:
|
||||
return type == Material.SALMON
|
||||
|| type == Material.COD
|
||||
|| type == Material.PUFFERFISH
|
||||
|| type == Material.TROPICAL_FISH;
|
||||
case RABBIT:
|
||||
return type == Material.CARROT || type == Material.GOLDEN_CARROT || type == Material.DANDELION;
|
||||
case LLAMA:
|
||||
return type == Material.HAY_BLOCK;
|
||||
case TURTLE:
|
||||
return type == Material.SEAGRASS;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -93,7 +93,8 @@ public class StackingTask extends BukkitRunnable {
|
||||
|
||||
if (initalEntity.isDead()
|
||||
|| !initalEntity.isValid()
|
||||
|| initalEntity instanceof ArmorStand) continue;
|
||||
|| initalEntity instanceof ArmorStand
|
||||
|| initalEntity.hasMetadata("inLove")) continue;
|
||||
|
||||
EntityStack initialStack = stackManager.getStack(initalEntity);
|
||||
if (initialStack == null && initalEntity.getCustomName() != null) continue;
|
||||
|
Loading…
Reference in New Issue
Block a user