From b8e2552547a0b9caf18412e9ecc044b5fa9a4bd9 Mon Sep 17 00:00:00 2001 From: Rikka0w0 <929513338@qq.com> Date: Sat, 11 Jul 2020 05:10:50 +1000 Subject: [PATCH 1/4] Impl PlayerChangedDimensionEvent, PlayerRespawnEvent and PlayerLoggedOutEvent --- .../event/entity/player/PlayerEvent.java | 69 +++++++++++++++---- .../impl/event/entity/EntityEvents.java | 6 -- .../impl/event/entity/PlayerEvents.java | 46 +++++++++++++ .../event/entity/MixinPlayerManager.java | 16 ++++- .../event/entity/MixinServerPlayerEntity.java | 57 +++++++++++++++ 5 files changed, 172 insertions(+), 22 deletions(-) create mode 100644 patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java diff --git a/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java b/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java index 4a0e47c9..4492af4c 100644 --- a/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java +++ b/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java @@ -22,6 +22,7 @@ import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.entity.Entity; /** @@ -57,16 +58,6 @@ public PlayerEntity getPlayer() { return playerEntity; } - /** - * Called on the server at the end of {@link net.minecraft.server.PlayerManager#onPlayerConnect(net.minecraft.network.ClientConnection, net.minecraft.server.network.ServerPlayerEntity)} - * when the player has finished logging in. - */ - public static class PlayerLoggedInEvent extends PlayerEvent { - public PlayerLoggedInEvent(PlayerEntity player) { - super(player); - } - } - /** * Fired when an Entity is started to be "tracked" by this player (the player receives updates about this entity, e.g. motion). */ @@ -131,6 +122,59 @@ public boolean isWasDeath() { } } + /** + * Called on the server at the end of {@link net.minecraft.server.PlayerManager#onPlayerConnect(net.minecraft.network.ClientConnection, net.minecraft.server.network.ServerPlayerEntity)} + * when the player has finished logging in. + */ + public static class PlayerLoggedInEvent extends PlayerEvent { + public PlayerLoggedInEvent(PlayerEntity player) { + super(player); + } + } + + public static class PlayerLoggedOutEvent extends PlayerEvent { + public PlayerLoggedOutEvent(PlayerEntity player) { + super(player); + } + } + + public static class PlayerRespawnEvent extends PlayerEvent { + private final boolean alive; + + public PlayerRespawnEvent(PlayerEntity player, boolean alive) { + super(player); + this.alive = alive; + } + + /** + * Did this respawn event come from the player conquering the end? + * TODO: Forge should name this to isAlive. + * @return if this respawn was because the player conquered the end + */ + public boolean isEndConquered() { + return this.alive; + } + } + + public static class PlayerChangedDimensionEvent extends PlayerEvent { + private final DimensionType fromDim; + private final DimensionType toDim; + + public PlayerChangedDimensionEvent(PlayerEntity player, DimensionType fromDim, DimensionType toDim) { + super(player); + this.fromDim = fromDim; + this.toDim = toDim; + } + + public DimensionType getFrom() { + return this.fromDim; + } + + public DimensionType getTo() { + return this.toDim; + } + } + /*TODO Events: HarvestCheck BreakSpeed @@ -140,8 +184,5 @@ public boolean isWasDeath() { Visibility ItemPickupEvent ItemCraftedEvent - ItemSmeltedEvent - PlayerLoggedOutEvent - PlayerRespawnEvent - PlayerChangedDimensionEvent*/ + ItemSmeltedEvent*/ } diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java index 3c753fd4..a932bee8 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java @@ -32,7 +32,6 @@ import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.Event; @@ -49,7 +48,6 @@ import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.world.IWorld; @@ -92,10 +90,6 @@ public static void onEnteringChunk(Entity entity, int newChunkX, int newChunkZ, } // PlayerEvents - public static void onPlayerLoggedIn(ServerPlayerEntity playerEntity) { - MinecraftForge.EVENT_BUS.post(new PlayerEvent.PlayerLoggedInEvent(playerEntity)); - } - public static boolean onLivingAttack(LivingEntity entity, DamageSource src, float damage) { return MinecraftForge.EVENT_BUS.post(new LivingAttackEvent(entity, src, damage)); } diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java new file mode 100644 index 00000000..b4dd468b --- /dev/null +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java @@ -0,0 +1,46 @@ +/* + * Minecraft Forge, Patchwork Project + * Copyright (c) 2016-2020, 2019-2020 + * + * 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.patchworkmc.impl.event.entity; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.PlayerEvent; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.dimension.DimensionType; + +public class PlayerEvents { + public static void firePlayerChangedDimensionEvent(PlayerEntity player, DimensionType fromDim, + DimensionType toDim) { + System.out.println("firePlayerChangedDimensionEvent"); + MinecraftForge.EVENT_BUS.post(new PlayerEvent.PlayerChangedDimensionEvent(player, fromDim, toDim)); + } + + public static void firePlayerLoggedIn(PlayerEntity player) { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.PlayerLoggedInEvent(player)); + } + + public static void firePlayerLoggedOut(PlayerEntity player) { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.PlayerLoggedOutEvent(player)); + } + + public static void firePlayerRespawnEvent(PlayerEntity player, boolean alive) { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.PlayerRespawnEvent(player, alive)); + } +} diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinPlayerManager.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinPlayerManager.java index afe509d9..3669c9ff 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinPlayerManager.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinPlayerManager.java @@ -23,17 +23,29 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.network.ClientConnection; import net.minecraft.server.PlayerManager; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.dimension.DimensionType; -import net.patchworkmc.impl.event.entity.EntityEvents; +import net.patchworkmc.impl.event.entity.PlayerEvents; @Mixin(PlayerManager.class) public class MixinPlayerManager { @Inject(method = "onPlayerConnect", at = @At("RETURN")) private void hookPlayerLogin(ClientConnection connection, ServerPlayerEntity player, CallbackInfo callback) { - EntityEvents.onPlayerLoggedIn(player); + PlayerEvents.firePlayerLoggedIn(player); + } + + @Inject(method = "remove", at = @At("HEAD")) + private void hookPlayerLogout(ServerPlayerEntity player, CallbackInfo callback) { + PlayerEvents.firePlayerLoggedOut(player); + } + + @Inject(method = "respawnPlayer", at = @At("RETURN")) + private void hookPlayerRespawn(ServerPlayerEntity player, DimensionType dimension, boolean alive, CallbackInfoReturnable callback) { + PlayerEvents.firePlayerRespawnEvent(player, alive); } } diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinServerPlayerEntity.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinServerPlayerEntity.java index 90bfc860..64585ce5 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinServerPlayerEntity.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinServerPlayerEntity.java @@ -22,15 +22,24 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerEvent; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.level.LevelProperties; import net.patchworkmc.impl.event.entity.EntityEvents; +import net.patchworkmc.impl.event.entity.PlayerEvents; @Mixin(ServerPlayerEntity.class) public class MixinServerPlayerEntity { @@ -49,4 +58,52 @@ private void hookCopyFromForCloneEvent(ServerPlayerEntity oldPlayer, boolean ali ServerPlayerEntity speThis = (ServerPlayerEntity) (Object) this; MinecraftForge.EVENT_BUS.post(new PlayerEvent.Clone(speThis, oldPlayer, !alive)); } + + //////////////////////////////////// + // PlayerChangedDimensionEvent + //////////////////////////////////// + @Inject(method = "teleport", + at = @At( + value = "INVOKE", + shift = Shift.AFTER, + ordinal = 0, + target = "net/minecraft/server/PlayerManager.method_14594(Lnet/minecraft/server/network/ServerPlayerEntity;)V" + ), + locals = LocalCapture.CAPTURE_FAILHARD + ) // PlayerManager.method_14594 -> sendInventory + private void teleport_sendInventory(ServerWorld targetWorld, double x, double y, double z, float yaw, float pitch, CallbackInfo info, ServerWorld serverWorld, LevelProperties levelProperties) { + ServerPlayerEntity me = (ServerPlayerEntity) (Object) this; + PlayerEvents.firePlayerChangedDimensionEvent(me, serverWorld.dimension.getType(), me.dimension); + } + + @Unique + private static final ThreadLocal changeDimension_from = new ThreadLocal<>(); + + @Inject(method = "changeDimension", + at = @At( + value = "INVOKE", + shift = Shift.AFTER, + ordinal = 0, + target = "net/minecraft/server/MinecraftServer.getWorld(Lnet/minecraft/world/dimension/DimensionType;)Lnet/minecraft/server/world/ServerWorld;" + ) + ) + private void changeDimension_getWorld(DimensionType newDimension, CallbackInfoReturnable info) { + ServerPlayerEntity me = (ServerPlayerEntity) (Object) this; + changeDimension_from.set(me.dimension); + } + + @Inject(method = "changeDimension", + at = @At( + value = "FIELD", + shift = Shift.AFTER, + ordinal = 0, + target = "net/minecraft/server/network/ServerPlayerEntity.field_13979:I" + ) + ) // ServerPlayerEntity.field_13979 -> lastFoodLevel + private void changeDimension_lastFoodLevel(DimensionType newDimension, CallbackInfoReturnable info) { + ServerPlayerEntity me = (ServerPlayerEntity) (Object) this; + DimensionType from = changeDimension_from.get(); + changeDimension_from.set(null); + PlayerEvents.firePlayerChangedDimensionEvent(me, from, newDimension); + } } From 17f948820f4271ef207fe4c80684b81f4b013add Mon Sep 17 00:00:00 2001 From: Rikka0w0 <929513338@qq.com> Date: Sat, 11 Jul 2020 05:55:49 +1000 Subject: [PATCH 2/4] Impl ItemPickupEvent, ItemCraftedEvent, ItemSmeltedEvent in PlayerEvent --- .../event/entity/player/PlayerEvent.java | 71 +++++++++++++++++-- .../impl/event/entity/PlayerEvents.java | 19 ++++- .../event/entity/MixinCraftingResultSlot.java | 58 +++++++++++++++ .../event/entity/MixinFurnaceOutputSlot.java | 47 ++++++++++++ .../mixin/event/entity/MixinItemEntity.java | 47 ++++++++++++ .../patchwork-events-entity.mixins.json | 3 + 6 files changed, 238 insertions(+), 7 deletions(-) create mode 100644 patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java create mode 100644 patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java create mode 100644 patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java diff --git a/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java b/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java index 4492af4c..42860d11 100644 --- a/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java +++ b/patchwork-events-entity/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java @@ -19,11 +19,16 @@ package net.minecraftforge.event.entity.player; +import javax.annotation.Nonnull; + import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; import net.minecraft.world.dimension.DimensionType; import net.minecraft.entity.Entity; +import net.minecraft.entity.ItemEntity; /** * PlayerEvent is fired whenever an event involving Living entities occurs. @@ -122,6 +127,67 @@ public boolean isWasDeath() { } } + public static class ItemPickupEvent extends PlayerEvent { + /** + * Original EntityItem with current remaining stack size. + */ + private final ItemEntity originalEntity; + /** + * Clone item stack, containing the item and amount picked up. + */ + private final ItemStack stack; + + public ItemPickupEvent(PlayerEntity player, ItemEntity entPickedUp, ItemStack stack) { + super(player); + this.originalEntity = entPickedUp; + this.stack = stack; + } + + public ItemStack getStack() { + return stack; + } + + public ItemEntity getOriginalEntity() { + return originalEntity; + } + } + + public static class ItemCraftedEvent extends PlayerEvent { + @Nonnull + private final ItemStack crafting; + private final Inventory craftMatrix; + + public ItemCraftedEvent(PlayerEntity player, @Nonnull ItemStack crafting, Inventory craftMatrix) { + super(player); + this.crafting = crafting; + this.craftMatrix = craftMatrix; + } + + @Nonnull + public ItemStack getCrafting() { + return this.crafting; + } + + public Inventory getInventory() { + return this.craftMatrix; + } + } + + public static class ItemSmeltedEvent extends PlayerEvent { + @Nonnull + private final ItemStack smelting; + + public ItemSmeltedEvent(PlayerEntity player, @Nonnull ItemStack crafting) { + super(player); + this.smelting = crafting; + } + + @Nonnull + public ItemStack getSmelting() { + return this.smelting; + } + } + /** * Called on the server at the end of {@link net.minecraft.server.PlayerManager#onPlayerConnect(net.minecraft.network.ClientConnection, net.minecraft.server.network.ServerPlayerEntity)} * when the player has finished logging in. @@ -181,8 +247,5 @@ public DimensionType getTo() { NameFormat LoadFromFile SaveToFile - Visibility - ItemPickupEvent - ItemCraftedEvent - ItemSmeltedEvent*/ + Visibility called by ForgeHooks.getPlayerVisibilityDistance, but latter is not called elsewhere*/ } diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java index b4dd468b..2ae93f40 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/PlayerEvents.java @@ -22,13 +22,14 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; import net.minecraft.world.dimension.DimensionType; public class PlayerEvents { - public static void firePlayerChangedDimensionEvent(PlayerEntity player, DimensionType fromDim, - DimensionType toDim) { - System.out.println("firePlayerChangedDimensionEvent"); + public static void firePlayerChangedDimensionEvent(PlayerEntity player, DimensionType fromDim, DimensionType toDim) { MinecraftForge.EVENT_BUS.post(new PlayerEvent.PlayerChangedDimensionEvent(player, fromDim, toDim)); } @@ -43,4 +44,16 @@ public static void firePlayerLoggedOut(PlayerEntity player) { public static void firePlayerRespawnEvent(PlayerEntity player, boolean alive) { MinecraftForge.EVENT_BUS.post(new PlayerEvent.PlayerRespawnEvent(player, alive)); } + + public static void firePlayerItemPickupEvent(PlayerEntity player, ItemEntity item, ItemStack clone) { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.ItemPickupEvent(player, item, clone)); + } + + public static void firePlayerCraftingEvent(PlayerEntity player, ItemStack crafted, Inventory craftMatrix) { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.ItemCraftedEvent(player, crafted, craftMatrix)); + } + + public static void firePlayerSmeltedEvent(PlayerEntity player, ItemStack smelted) { + MinecraftForge.EVENT_BUS.post(new PlayerEvent.ItemSmeltedEvent(player, smelted)); + } } diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java new file mode 100644 index 00000000..b800bcf0 --- /dev/null +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java @@ -0,0 +1,58 @@ +/* + * Minecraft Forge, Patchwork Project + * Copyright (c) 2016-2020, 2019-2020 + * + * 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.patchworkmc.mixin.event.entity; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.At.Shift; + +import net.minecraft.container.CraftingResultSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.ItemStack; + +import net.patchworkmc.impl.event.entity.PlayerEvents; + +@Mixin(CraftingResultSlot.class) +public abstract class MixinCraftingResultSlot { + @Shadow + @Final + private PlayerEntity player; + + @Shadow + @Final + private CraftingInventory craftingInv; + + @Inject(method = "onCrafted(Lnet/minecraft/item/ItemStack;)V", + at = @At( + value = "INVOKE", + shift = Shift.AFTER, + ordinal = 0, + target = "net/minecraft/item/ItemStack.onCraft(Lnet/minecraft/world/World;Lnet/minecraft/entity/player/PlayerEntity;I)V" + ) + ) + private void onCrafted_stack_onCraft(ItemStack stack, CallbackInfo ci) { + PlayerEvents.firePlayerCraftingEvent(player, stack, craftingInv); + } +} diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java new file mode 100644 index 00000000..f50f1dbf --- /dev/null +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java @@ -0,0 +1,47 @@ +/* + * Minecraft Forge, Patchwork Project + * Copyright (c) 2016-2020, 2019-2020 + * + * 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.patchworkmc.mixin.event.entity; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.container.FurnaceOutputSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; + +import net.patchworkmc.impl.event.entity.PlayerEvents; + +@Mixin(FurnaceOutputSlot.class) +public abstract class MixinFurnaceOutputSlot { + @Shadow + @Final + private PlayerEntity player; + + @Inject(method = "onCrafted(Lnet/minecraft/item/ItemStack;)V", + at = @At("RETURN") + ) + private void onCrafted_return(ItemStack stack, CallbackInfo ci) { + PlayerEvents.firePlayerSmeltedEvent(player, stack); + } +} diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java new file mode 100644 index 00000000..566d83be --- /dev/null +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java @@ -0,0 +1,47 @@ +/* + * Minecraft Forge, Patchwork Project + * Copyright (c) 2016-2020, 2019-2020 + * + * 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.patchworkmc.mixin.event.entity; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.At.Shift; + +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.player.PlayerEntity; + +import net.patchworkmc.impl.event.entity.PlayerEvents; + +@Mixin(ItemEntity.class) +public abstract class MixinItemEntity { + @Inject(method = "onPlayerCollision", + at = @At( + value = "INVOKE", + shift = Shift.BEFORE, + ordinal = 0, + target = "net/minecraft/item/ItemStack.isEmpty()Z" + ) + ) + private void onPlayerCollision_isEmpty(PlayerEntity player, CallbackInfo ci) { + ItemEntity me = (ItemEntity) (Object) this; + PlayerEvents.firePlayerItemPickupEvent(player, me, me.getStack().copy()); + } +} diff --git a/patchwork-events-entity/src/main/resources/patchwork-events-entity.mixins.json b/patchwork-events-entity/src/main/resources/patchwork-events-entity.mixins.json index 7b7c0180..7864a2d6 100644 --- a/patchwork-events-entity/src/main/resources/patchwork-events-entity.mixins.json +++ b/patchwork-events-entity/src/main/resources/patchwork-events-entity.mixins.json @@ -3,10 +3,13 @@ "package": "net.patchworkmc.mixin.event.entity", "compatibilityLevel": "JAVA_8", "mixins": [ + "MixinCraftingResultSlot", "MixinEntity", "MixinEntityTrackerEntry", "MixinEntityType", "MixinExperienceOrbEntity", + "MixinFurnaceOutputSlot", + "MixinItemEntity", "MixinLivingEntity", "MixinMobEntity", "MixinMobSpawnerLogic", From 8241ab25288811009d812151fe84e6577793d025 Mon Sep 17 00:00:00 2001 From: Rikka0w0 <929513338@qq.com> Date: Wed, 22 Jul 2020 23:55:20 +1000 Subject: [PATCH 3/4] Add methods to the god class --- .../impl/event/entity/EntityEvents.java | 1 - .../fml/hooks/BasicEventHooks.java | 34 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java index eebcbd0e..5f6e2c70 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/impl/event/entity/EntityEvents.java @@ -37,7 +37,6 @@ import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.Event; diff --git a/patchwork-god-classes/src/main/java/net/minecraftforge/fml/hooks/BasicEventHooks.java b/patchwork-god-classes/src/main/java/net/minecraftforge/fml/hooks/BasicEventHooks.java index 25543a43..b843dac4 100644 --- a/patchwork-god-classes/src/main/java/net/minecraftforge/fml/hooks/BasicEventHooks.java +++ b/patchwork-god-classes/src/main/java/net/minecraftforge/fml/hooks/BasicEventHooks.java @@ -21,8 +21,12 @@ import net.minecraftforge.event.TickEvent; +import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; import net.minecraft.world.World; +import net.minecraft.world.dimension.DimensionType; import net.patchworkmc.impl.event.entity.PlayerEvents; import net.patchworkmc.impl.event.lifecycle.LifecycleEvents; @@ -32,10 +36,37 @@ * Do not keep implementation details here, methods should be thin wrappers around methods in other modules. */ public class BasicEventHooks { + public static void firePlayerChangedDimensionEvent(PlayerEntity player, DimensionType fromDim, DimensionType toDim) { + PlayerEvents.firePlayerChangedDimensionEvent(player, fromDim, toDim); + } + public static void firePlayerLoggedIn(PlayerEntity player) { PlayerEvents.firePlayerLoggedIn(player); } + public static void firePlayerLoggedOut(PlayerEntity player) { + PlayerEvents.firePlayerLoggedOut(player); + } + + public static void firePlayerRespawnEvent(PlayerEntity player, boolean endConquered) { + PlayerEvents.firePlayerRespawnEvent(player, endConquered); + } + + public static void firePlayerItemPickupEvent(PlayerEntity player, ItemEntity item, ItemStack clone) { + PlayerEvents.firePlayerItemPickupEvent(player, item, clone); + } + + public static void firePlayerCraftingEvent(PlayerEntity player, ItemStack crafted, Inventory craftMatrix) { + PlayerEvents.firePlayerCraftingEvent(player, crafted, craftMatrix); + } + + public static void firePlayerSmeltedEvent(PlayerEntity player, ItemStack smelted) { + PlayerEvents.firePlayerSmeltedEvent(player, smelted); + } + + // TODO: onRenderTickStart + // TODO: onRenderTickEnd + public static void onPlayerPreTick(PlayerEntity player) { LifecycleEvents.firePlayerTickEvent(TickEvent.Phase.START, player); } @@ -59,4 +90,7 @@ public static void onPreClientTick() { public static void onPostClientTick() { LifecycleEvents.fireClientTickEvent(TickEvent.Phase.END); } + + // TODO: onPreServerTick + // TODO: onPostServerTick } From 1941e941b6006b933cd4c47a0c39a4c898c5d5cb Mon Sep 17 00:00:00 2001 From: Rikka0w0 <929513338@qq.com> Date: Wed, 29 Jul 2020 18:31:56 +1000 Subject: [PATCH 4/4] Apply leo60228's suggestion --- .../patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java | 2 +- .../patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java | 2 +- .../net/patchworkmc/mixin/event/entity/MixinItemEntity.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java index b800bcf0..560c80cb 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinCraftingResultSlot.java @@ -52,7 +52,7 @@ public abstract class MixinCraftingResultSlot { target = "net/minecraft/item/ItemStack.onCraft(Lnet/minecraft/world/World;Lnet/minecraft/entity/player/PlayerEntity;I)V" ) ) - private void onCrafted_stack_onCraft(ItemStack stack, CallbackInfo ci) { + private void onStackCrafted(ItemStack stack, CallbackInfo ci) { PlayerEvents.firePlayerCraftingEvent(player, stack, craftingInv); } } diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java index f50f1dbf..b79e43c2 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinFurnaceOutputSlot.java @@ -41,7 +41,7 @@ public abstract class MixinFurnaceOutputSlot { @Inject(method = "onCrafted(Lnet/minecraft/item/ItemStack;)V", at = @At("RETURN") ) - private void onCrafted_return(ItemStack stack, CallbackInfo ci) { + private void onCraftingFinished(ItemStack stack, CallbackInfo ci) { PlayerEvents.firePlayerSmeltedEvent(player, stack); } } diff --git a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java index 566d83be..5f1fccc4 100644 --- a/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java +++ b/patchwork-events-entity/src/main/java/net/patchworkmc/mixin/event/entity/MixinItemEntity.java @@ -40,7 +40,7 @@ public abstract class MixinItemEntity { target = "net/minecraft/item/ItemStack.isEmpty()Z" ) ) - private void onPlayerCollision_isEmpty(PlayerEntity player, CallbackInfo ci) { + private void onPlayerPickUpItemEntity(PlayerEntity player, CallbackInfo ci) { ItemEntity me = (ItemEntity) (Object) this; PlayerEvents.firePlayerItemPickupEvent(player, me, me.getStack().copy()); }