#683: Add PlayerBucketFishEvent

By: DiamondDagger590 <diamonddagger590@gmail.com>
This commit is contained in:
CraftBukkit/Spigot 2021-04-25 08:34:44 +10:00
parent d6327a1b65
commit 93ddc2d863
2 changed files with 58 additions and 2 deletions

View file

@ -1,6 +1,21 @@
--- a/net/minecraft/world/entity/animal/EntityFish.java
+++ b/net/minecraft/world/entity/animal/EntityFish.java
@@ -70,7 +70,7 @@
@@ -41,6 +41,14 @@
import net.minecraft.world.level.block.state.IBlockData;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
+import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
+import net.minecraft.network.protocol.game.PacketPlayOutSpawnEntityLiving;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.event.player.PlayerBucketFishEvent;
+// CraftBukkit end
+
public abstract class EntityFish extends EntityWaterAnimal {
private static final DataWatcherObject<Boolean> FROM_BUCKET = DataWatcher.a(EntityFish.class, DataWatcherRegistry.i);
@@ -70,7 +78,7 @@
@Override
public boolean isTypeNotPersistent(double d0) {
@ -9,7 +24,7 @@
}
@Override
@@ -90,6 +90,7 @@
@@ -90,6 +98,7 @@
public void setFromBucket(boolean flag) {
this.datawatcher.set(EntityFish.FROM_BUCKET, flag);
@ -17,3 +32,30 @@
}
@Override
@@ -153,11 +162,24 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.WATER_BUCKET && this.isAlive()) {
+ // CraftBukkit start
+ ItemStack itemstack1 = this.eK();
+ this.k(itemstack1);
+
+ PlayerBucketFishEvent playerBucketFishEvent = CraftEventFactory.callPlayerFishBucketEvent(this, entityhuman, itemstack, itemstack1);
+ itemstack1 = CraftItemStack.asNMSCopy(playerBucketFishEvent.getFishBucket());
+ if (playerBucketFishEvent.isCancelled()) {
+ ((EntityPlayer) entityhuman).updateInventory(((EntityPlayer) entityhuman).activeContainer); // We need to update inventory to resync client's bucket
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSpawnEntityLiving(this)); // We need to play out these packets as the client assumes the fish is gone
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutEntityMetadata(this.getId(), datawatcher, true)); // Need to send data such as the display name to client
+ return EnumInteractionResult.FAIL;
+ }
+ // CraftBukkit end
this.playSound(SoundEffects.ITEM_BUCKET_FILL_FISH, 1.0F, 1.0F);
itemstack.subtract(1);
- ItemStack itemstack1 = this.eK();
+ // ItemStack itemstack1 = this.eK(); // CraftBukkit - moved up
- this.k(itemstack1);
+ // this.k(itemstack1); // CraftBukkit - moved up
if (!this.world.isClientSide) {
CriterionTriggers.j.a((EntityPlayer) entityhuman, itemstack1);
}

View file

@ -32,6 +32,7 @@ import net.minecraft.world.entity.EntityInsentient;
import net.minecraft.world.entity.EntityLiving;
import net.minecraft.world.entity.EntityTypes;
import net.minecraft.world.entity.animal.EntityAnimal;
import net.minecraft.world.entity.animal.EntityFish;
import net.minecraft.world.entity.animal.EntityGolem;
import net.minecraft.world.entity.animal.EntityWaterAnimal;
import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon;
@ -101,6 +102,7 @@ import org.bukkit.entity.Creeper;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.ExperienceOrb;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Fish;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Item;
import org.bukkit.entity.LightningStrike;
@ -193,6 +195,7 @@ import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerBedEnterEvent.BedEnterResult;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerBucketFillEvent;
import org.bukkit.event.player.PlayerBucketFishEvent;
import org.bukkit.event.player.PlayerEditBookEvent;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.event.player.PlayerExpChangeEvent;
@ -298,6 +301,17 @@ public class CraftEventFactory {
return playerHarvestBlockEvent;
}
/**
* Player Fish Bucket Event
*/
public static PlayerBucketFishEvent callPlayerFishBucketEvent(EntityFish fish, EntityHuman entityHuman, ItemStack waterBucket, ItemStack fishBucket) {
Fish bukkitFish = (Fish) fish.getBukkitEntity();
Player player = (Player) entityHuman.getBukkitEntity();
PlayerBucketFishEvent playerBucketFishEvent = new PlayerBucketFishEvent(player, bukkitFish, CraftItemStack.asBukkitCopy(waterBucket), CraftItemStack.asBukkitCopy(fishBucket));
Bukkit.getPluginManager().callEvent(playerBucketFishEvent);
return playerBucketFishEvent;
}
/**
* Trade Index Change Event
*/