From a7f479d4e24ebdcef367e6ebcb9bbc44289f6717 Mon Sep 17 00:00:00 2001 From: mergu Date: Thu, 17 Jan 2019 21:53:42 -0500 Subject: [PATCH] Add entity breeds event, fixes #1870 --- .../java/net/aufdemrand/denizen/Denizen.java | 3 + .../events/entity/EntityBreedScriptEvent.java | 145 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 plugin/src/main/java/net/aufdemrand/denizen/events/entity/EntityBreedScriptEvent.java diff --git a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java index 09a4459d22..5589adc384 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/Denizen.java @@ -600,6 +600,9 @@ public void onEnable() { ScriptEvent.registerScriptEvent(new ChunkUnloadScriptEvent()); ScriptEvent.registerScriptEvent(new CreeperPoweredScriptEvent()); ScriptEvent.registerScriptEvent(new EntityBreaksHangingScriptEvent()); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_10_R1)) { + ScriptEvent.registerScriptEvent(new EntityBreedScriptEvent()); + } ScriptEvent.registerScriptEvent(new EntityChangesBlockScriptEvent()); ScriptEvent.registerScriptEvent(new EntityCombustsScriptEvent()); ScriptEvent.registerScriptEvent(new EntityCreatePortalScriptEvent()); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/events/entity/EntityBreedScriptEvent.java b/plugin/src/main/java/net/aufdemrand/denizen/events/entity/EntityBreedScriptEvent.java new file mode 100644 index 0000000000..febd5a6d08 --- /dev/null +++ b/plugin/src/main/java/net/aufdemrand/denizen/events/entity/EntityBreedScriptEvent.java @@ -0,0 +1,145 @@ +package net.aufdemrand.denizen.events.entity; + +import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.events.BukkitScriptEvent; +import net.aufdemrand.denizen.nms.NMSHandler; +import net.aufdemrand.denizen.objects.dEntity; +import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizencore.objects.Element; +import net.aufdemrand.denizencore.objects.aH; +import net.aufdemrand.denizencore.objects.dObject; +import net.aufdemrand.denizencore.scripts.ScriptEntryData; +import net.aufdemrand.denizencore.scripts.containers.ScriptContainer; +import net.aufdemrand.denizencore.utilities.CoreUtilities; +import org.bukkit.Bukkit; +import org.bukkit.entity.Animals; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityBreedEvent; + +public class EntityBreedScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // entity breeds (in ) + // breeds (in ) + // + // @Regex ^on [^\s]+ breeds( in ((notable (cuboid|ellipsoid))|([^\s]+)))?$ + // + // @Cancellable true + // + // @Triggers when two entities breed. + // + // @Context + // returns the dEntity responsible for breeding, if it exists. + // returns the child dEntity. The returned entity will not be spawned within the world, so most operations are invalid until the event fires. + // returns the parent dEntity creating the child. The child will spawn at the mother's location. + // returns the other parent dEntity. + // returns the dItem used to initiate breeding, if it exists. + // returns the amount of experience granted by breeding. + // + // @Determine + // Element(Integer) to set the amount of experience granted by breeding. + // + // --> + + public EntityBreedScriptEvent() { + instance = this; + } + + public static EntityBreedScriptEvent instance; + private dEntity entity; + private dEntity breeder; + private dEntity father; + private dEntity mother; + private dItem item; + private int experience; + public EntityBreedEvent event; + + @Override + public boolean couldMatch(ScriptContainer scriptContainer, String s) { + return CoreUtilities.getXthArg(1, CoreUtilities.toLowerCase(s)).equals("breeds"); + } + + @Override + public boolean matches(ScriptContainer scriptContainer, String s) { + String lower = CoreUtilities.toLowerCase(s); + + if (!tryEntity(entity, CoreUtilities.getXthArg(0, lower))) { + return false; + } + + return runInCheck(scriptContainer, s, lower, entity.getLocation()); + } + + @Override + public String getName() { + return "EntityBreeds"; + } + + @Override + public void init() { + Bukkit.getServer().getPluginManager().registerEvents(this, DenizenAPI.getCurrentInstance()); + } + + @Override + public void destroy() { + EntityBreedEvent.getHandlerList().unregister(this); + } + + @Override + public boolean applyDetermination(ScriptContainer container, String determination) { + if (aH.matchesInteger(determination)) { + experience = aH.getIntegerFrom(determination); + return true; + } + return super.applyDetermination(container, determination); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(null, null); + } + + @Override + public dObject getContext(String name) { + switch (name) { + case "child": + return entity; + case "breeder": + return breeder; + case "father": + return father; + case "mother": + return mother; + case "item": + return item; + case "experience": + return new Element(experience); + default: + return super.getContext(name); + } + } + + @EventHandler + public void onEntityBreeds(EntityBreedEvent event) { + entity = new dEntity(event.getEntity()); + breeder = new dEntity(event.getBreeder()); + father = new dEntity(event.getFather()); + mother = new dEntity(event.getMother()); + item = new dItem(event.getBredWith()); + experience = event.getExperience(); + cancelled = event.isCancelled(); + this.event = event; + fire(); + event.setCancelled(cancelled); + event.setExperience(experience); + + // Prevent entities from continuing to breed with each other + if (cancelled) { + NMSHandler.getInstance().getEntityHelper().setBreeding((Animals) father.getLivingEntity(), false); + NMSHandler.getInstance().getEntityHelper().setBreeding((Animals) mother.getLivingEntity(), false); + } + } +}