diff --git a/src/main/java/com/gmail/nossr50/events/skills/taming/McMMOPlayerTameEntityEvent.java b/src/main/java/com/gmail/nossr50/events/skills/taming/McMMOPlayerTameEntityEvent.java new file mode 100644 index 000000000..038057d7c --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/skills/taming/McMMOPlayerTameEntityEvent.java @@ -0,0 +1,76 @@ +package com.gmail.nossr50.events.skills.taming; + +import com.gmail.nossr50.datatypes.experience.XPGainReason; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.events.experience.McMMOPlayerExperienceEvent; +import com.google.common.base.Preconditions; +import org.bukkit.entity.Entity; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +/** + * Called when a player has tamed an entity, and we are about to award them experience for it. + */ +public class McMMOPlayerTameEntityEvent extends McMMOPlayerExperienceEvent { + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private final McMMOPlayer mmoPlayer; + private float xpGained; + private final Entity tamedEntity; + + public McMMOPlayerTameEntityEvent(@NotNull McMMOPlayer mmoPlayer, float xp, @NotNull Entity tamedEntity) { + super(mmoPlayer.getPlayer(), PrimarySkillType.TAMING, XPGainReason.PVE); + this.mmoPlayer = mmoPlayer; + this.xpGained = xp; + this.tamedEntity = tamedEntity; + } + + /** + * @return The {@link McMMOPlayer} associated with this event. + */ + @NotNull + public McMMOPlayer getMcMMOPlayer() { + return mmoPlayer; + } + + /** + * @return The raw experience that the player will receive. + */ + public float getXpGained() { + return this.xpGained; + } + + /** + * @param xpGained The raw experience that the player will receive. + * @throws IllegalArgumentException if xpGained is NaN, infinite, or not positive. + */ + public void setXpGained(float xpGained) { + Preconditions.checkArgument(Float.isFinite(xpGained), "new gained xp must be a number"); + Preconditions.checkArgument(xpGained > 0, "new gained xp must be a positive number"); + + this.xpGained = xpGained; + } + + @NotNull + public Entity getTamedEntity() { + return tamedEntity; + } + + /** + * @apiNote Cancelling this event prevents experience from being awarded, but the entity will remain tamed. + */ + @Override + public void setCancelled(boolean cancelled) { + super.setCancelled(cancelled); + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLER_LIST; + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java index 104231f69..9d514aaa0 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -2,12 +2,14 @@ package com.gmail.nossr50.skills.taming; import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.datatypes.experience.XPGainReason; +import com.gmail.nossr50.datatypes.experience.XPGainSource; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.subskills.taming.CallOfTheWildType; import com.gmail.nossr50.datatypes.skills.subskills.taming.TamingSummon; +import com.gmail.nossr50.events.skills.taming.McMMOPlayerTameEntityEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.metadata.MobMetaFlagType; @@ -136,7 +138,13 @@ public class TamingManager extends SkillManager { * @param entity The LivingEntity to award XP for */ public void awardTamingXP(@NotNull LivingEntity entity) { - applyXpGain(ExperienceConfig.getInstance().getTamingXP(entity.getType()), XPGainReason.PVE); + int xp = ExperienceConfig.getInstance().getTamingXP(entity.getType()); + + final McMMOPlayerTameEntityEvent event = new McMMOPlayerTameEntityEvent(mmoPlayer, xp, entity); + mcMMO.p.getServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) + applyXpGain(event.getXpGained(), XPGainReason.PVE, XPGainSource.SELF); } /**