diff --git a/patches/minecraft/net/minecraft/entity/player/PlayerEntity.java.patch b/patches/minecraft/net/minecraft/entity/player/PlayerEntity.java.patch index 64161e3d8..9664d1fdc 100644 --- a/patches/minecraft/net/minecraft/entity/player/PlayerEntity.java.patch +++ b/patches/minecraft/net/minecraft/entity/player/PlayerEntity.java.patch @@ -425,7 +425,29 @@ } } -@@ -1703,7 +1818,10 @@ +@@ -1462,6 +1577,10 @@ + } + + public void func_195068_e(int p_195068_1_) { ++ net.minecraftforge.event.entity.player.PlayerXpEvent.XpChange event = new net.minecraftforge.event.entity.player.PlayerXpEvent.XpChange(this, p_195068_1_); ++ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) return; ++ p_195068_1_ = event.getAmount(); ++ + this.func_85039_t(p_195068_1_); + this.field_71106_cc += (float)p_195068_1_ / (float)this.func_71050_bK(); + this.field_71067_cb = MathHelper.func_76125_a(this.field_71067_cb + p_195068_1_, 0, Integer.MAX_VALUE); +@@ -1501,6 +1620,10 @@ + } + + public void func_82242_a(int p_82242_1_) { ++ net.minecraftforge.event.entity.player.PlayerXpEvent.LevelChange event = new net.minecraftforge.event.entity.player.PlayerXpEvent.LevelChange(this, p_82242_1_); ++ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) return; ++ p_82242_1_ = event.getLevels(); ++ + this.field_71068_ca += p_82242_1_; + if (this.field_71068_ca < 0) { + this.field_71068_ca = 0; +@@ -1703,7 +1826,10 @@ } public ITextComponent func_145748_c_() { @@ -437,7 +459,7 @@ return this.func_208016_c(itextcomponent); } -@@ -1939,4 +2057,44 @@ +@@ -1939,4 +2065,44 @@ return this.field_221260_g; } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerPickupXpEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerPickupXpEvent.java index 7465fd915..eb3777c9c 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerPickupXpEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerPickupXpEvent.java @@ -19,27 +19,21 @@ package net.minecraftforge.event.entity.player; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.entity.item.ExperienceOrbEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraftforge.eventbus.api.Cancelable; /** - * This event is called when a player collides with a EntityXPOrb on the ground. - * The event can be canceled, and no further processing will be done. + * Use {@link PlayerXpEvent.PickupXp} */ @Cancelable -public class PlayerPickupXpEvent extends PlayerEvent +@Deprecated +public class PlayerPickupXpEvent extends PlayerXpEvent.PickupXp { - private final ExperienceOrbEntity orb; public PlayerPickupXpEvent(PlayerEntity player, ExperienceOrbEntity orb) { - super(player); - this.orb = orb; + super(player, orb); } - public ExperienceOrbEntity getOrb() - { - return orb; - } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerXpEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerXpEvent.java new file mode 100644 index 000000000..4b9ceced1 --- /dev/null +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerXpEvent.java @@ -0,0 +1,121 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2019. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.minecraftforge.event.entity.player; + +import net.minecraft.entity.item.ExperienceOrbEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.Cancelable; + +/** + * PlayerXpEvent is fired whenever an event involving player experience occurs.
+ * If a method utilizes this {@link net.minecraftforge.eventbus.api.Event} as its parameter, the method will + * receive every child event of this class.
+ *
+ * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}. + */ +public class PlayerXpEvent extends PlayerEvent +{ + + public PlayerXpEvent(PlayerEntity player) + { + super(player); + } + + /** + * This event is fired after the player collides with an experience orb, but before the player has been given the experience. + * It can be cancelled, and no further processing will be done. + */ + @Cancelable + public static class PickupXp extends PlayerXpEvent + { + + private final ExperienceOrbEntity orb; + + public PickupXp(PlayerEntity player, ExperienceOrbEntity orb) + { + super(player); + this.orb = orb; + } + + public ExperienceOrbEntity getOrb() + { + return orb; + } + + } + + /** + * This event is fired when the player's experience changes through the {@link PlayerEntity#giveExperiencePoints} method. + * It can be cancelled, and no further processing will be done. + */ + @Cancelable + public static class XpChange extends PlayerXpEvent + { + + private int amount; + + public XpChange(PlayerEntity player, int amount) + { + super(player); + this.amount = amount; + } + + public int getAmount() + { + return this.amount; + } + + public void setAmount(int amount) + { + this.amount = amount; + } + + } + + /** + * This event is fired when the player's experience level changes through the {@link PlayerEntity#addExperienceLevel} method. + * It can be cancelled, and no further processing will be done. + */ + @Cancelable + public static class LevelChange extends PlayerXpEvent + { + + private int levels; + + public LevelChange(PlayerEntity player, int levels) + { + super(player); + this.levels = levels; + } + + public int getLevels() + { + return this.levels; + } + + public void setLevels(int levels) + { + this.levels = levels; + } + + } + +} diff --git a/src/test/java/net/minecraftforge/debug/entity/player/PlayerXpEventTest.java b/src/test/java/net/minecraftforge/debug/entity/player/PlayerXpEventTest.java new file mode 100644 index 000000000..2d007e40c --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/entity/player/PlayerXpEventTest.java @@ -0,0 +1,54 @@ +package net.minecraftforge.debug.entity.player; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraftforge.event.entity.player.PlayerPickupXpEvent; +import net.minecraftforge.event.entity.player.PlayerXpEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod("player_xp_event_test") +@Mod.EventBusSubscriber() +public class PlayerXpEventTest +{ + + private static final boolean ENABLE = false; + private static Logger logger = LogManager.getLogger(PlayerXpEventTest.class); + + @SubscribeEvent + public static void onPlayerXpEvent(PlayerXpEvent event) + { + if (!ENABLE) return; + logger.info("The PlayerXpEvent has been called!"); + } + + @SubscribeEvent + public static void onPlayerPickupXpOld(PlayerPickupXpEvent event) + { + if (!ENABLE) return; + logger.info("The deprecated PlayerPickupXpEvent has been called!"); + } + + @SubscribeEvent + public static void onPlayerPickupXp(PlayerXpEvent.PickupXp event) + { + if (!ENABLE) return; + logger.info("{} picked up an experience orb worth {}", event.getPlayer().getName().getString(), event.getOrb().getXpValue()); + } + + @SubscribeEvent + public static void onPlayerXpChange(PlayerXpEvent.XpChange event) + { + if (!ENABLE) return; + logger.info("{} has been given {} experience", event.getPlayer().getName().getString(), event.getAmount()); + } + + @SubscribeEvent + public static void onPlayerLevelChange(PlayerXpEvent.LevelChange event) + { + if (!ENABLE) return; + logger.info("{} has changed {} levels", event.getPlayer().getName().getString(), event.getLevels()); + } + +} diff --git a/src/test/resources/META-INF/mods.toml b/src/test/resources/META-INF/mods.toml index 32c28d058..d74f85d9c 100644 --- a/src/test/resources/META-INF/mods.toml +++ b/src/test/resources/META-INF/mods.toml @@ -54,4 +54,6 @@ loaderVersion="[28,)" [[mods]] modId="flower_pot_test" [[mods]] - modId="forgeblockstatesloader" \ No newline at end of file + modId="player_xp_event_test" +[[mods]] + modId="forgeblockstatesloader"