--- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java @@ -99,6 +99,7 @@ private float dancingAnimationTicks; private float spinningAnimationTicks; private float spinningAnimationTicks0; + public boolean forceDancing = false; // CraftBukkit public Allay(EntityTypes entitytypes, World world) { super(entitytypes, world); @@ -110,6 +111,12 @@ this.dynamicJukeboxListener = new DynamicGameEventListener<>(new Allay.a(this.vibrationUser.getPositionSource(), ((GameEvent) GameEvent.JUKEBOX_PLAY.value()).notificationRadius())); } + // CraftBukkit start + public void setCanDuplicate(boolean canDuplicate) { + this.entityData.set(Allay.DATA_CAN_DUPLICATE, canDuplicate); + } + // CraftBukkit end + @Override protected BehaviorController.b brainProvider() { return BehaviorController.provider(Allay.MEMORY_TYPES, Allay.SENSOR_TYPES); @@ -122,7 +129,7 @@ @Override public BehaviorController getBrain() { - return super.getBrain(); + return (BehaviorController) super.getBrain(); // CraftBukkit - decompile error } public static AttributeProvider.Builder createAttributes() { @@ -223,7 +230,7 @@ public void aiStep() { super.aiStep(); if (!this.level().isClientSide && this.isAlive() && this.tickCount % 10 == 0) { - this.heal(1.0F); + this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit } if (this.isDancing() && this.shouldStopDancing() && this.tickCount % 20 == 0) { @@ -293,7 +300,12 @@ ItemStack itemstack1 = this.getItemInHand(EnumHand.MAIN_HAND); if (this.isDancing() && this.isDuplicationItem(itemstack) && this.canDuplicate()) { - this.duplicateAllay(); + // CraftBukkit start - handle cancel duplication + Allay allay = this.duplicateAllay(); + if (allay == null) { + return EnumInteractionResult.SUCCESS; + } + // CraftBukkit end this.level().broadcastEntityEvent(this, (byte) 18); this.level().playSound(entityhuman, (Entity) this, SoundEffects.AMETHYST_BLOCK_CHIME, SoundCategory.NEUTRAL, 2.0F, 1.0F); this.removeInteractionItem(entityhuman, itemstack); @@ -304,7 +316,7 @@ this.setItemInHand(EnumHand.MAIN_HAND, itemstack2); this.removeInteractionItem(entityhuman, itemstack); this.level().playSound(entityhuman, (Entity) this, SoundEffects.ALLAY_ITEM_GIVEN, SoundCategory.NEUTRAL, 2.0F, 1.0F); - this.getBrain().setMemory(MemoryModuleType.LIKED_PLAYER, (Object) entityhuman.getUUID()); + this.getBrain().setMemory(MemoryModuleType.LIKED_PLAYER, entityhuman.getUUID()); // CraftBukkit - decompile error return EnumInteractionResult.SUCCESS; } else if (!itemstack1.isEmpty() && enumhand == EnumHand.MAIN_HAND && itemstack.isEmpty()) { this.setItemSlot(EnumItemSlot.MAINHAND, ItemStack.EMPTY); @@ -405,6 +417,7 @@ } private boolean shouldStopDancing() { + if (this.forceDancing) {return false;} // CraftBukkit return this.jukeboxPos == null || !this.jukeboxPos.closerToCenterThan(this.position(), (double) ((GameEvent) GameEvent.JUKEBOX_PLAY.value()).notificationRadius()) || !this.level().getBlockState(this.jukeboxPos).is(Blocks.JUKEBOX); } @@ -449,7 +462,7 @@ public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); this.writeInventoryToTag(nbttagcompound, this.registryAccess()); - DataResult dataresult = VibrationSystem.a.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.vibrationData); + DataResult dataresult = VibrationSystem.a.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.vibrationData); // CraftBukkit - decompile error Logger logger = Allay.LOGGER; Objects.requireNonNull(logger); @@ -465,7 +478,7 @@ super.readAdditionalSaveData(nbttagcompound); this.readInventoryFromTag(nbttagcompound, this.registryAccess()); if (nbttagcompound.contains("listener", 10)) { - DataResult dataresult = VibrationSystem.a.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); + DataResult dataresult = VibrationSystem.a.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); // CraftBukkit - decompile error Logger logger = Allay.LOGGER; Objects.requireNonNull(logger); @@ -498,7 +511,7 @@ return Allay.DUPLICATION_ITEM.test(itemstack); } - public void duplicateAllay() { + public Allay duplicateAllay() { // CraftBukkit - return allay Allay allay = (Allay) EntityTypes.ALLAY.create(this.level()); if (allay != null) { @@ -506,9 +519,9 @@ allay.setPersistenceRequired(); allay.resetDuplicationCooldown(); this.resetDuplicationCooldown(); - this.level().addFreshEntity(allay); + this.level().addFreshEntity(allay, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DUPLICATION); // CraftBukkit - reason for duplicated allay } - + return allay; // CraftBukkit } public void resetDuplicationCooldown() {