diff options
Diffstat (limited to 'patch-remap/mache-vineflower/net/minecraft/world/entity/projectile/ThrownPotion.java.patch')
-rw-r--r-- | patch-remap/mache-vineflower/net/minecraft/world/entity/projectile/ThrownPotion.java.patch | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/patch-remap/mache-vineflower/net/minecraft/world/entity/projectile/ThrownPotion.java.patch b/patch-remap/mache-vineflower/net/minecraft/world/entity/projectile/ThrownPotion.java.patch new file mode 100644 index 0000000000..b61b8d9855 --- /dev/null +++ b/patch-remap/mache-vineflower/net/minecraft/world/entity/projectile/ThrownPotion.java.patch @@ -0,0 +1,381 @@ +--- a/net/minecraft/world/entity/projectile/ThrownPotion.java ++++ b/net/minecraft/world/entity/projectile/ThrownPotion.java +@@ -1,19 +1,21 @@ + package net.minecraft.world.entity.projectile; + ++import java.util.Iterator; + import java.util.List; + import java.util.function.Predicate; + import javax.annotation.Nullable; + import net.minecraft.core.BlockPos; + import net.minecraft.core.Direction; + import net.minecraft.nbt.CompoundTag; ++import net.minecraft.server.level.ServerPlayer; + import net.minecraft.tags.BlockTags; + import net.minecraft.world.effect.MobEffect; + import net.minecraft.world.effect.MobEffectInstance; + import net.minecraft.world.entity.AreaEffectCloud; + import net.minecraft.world.entity.Entity; + import net.minecraft.world.entity.EntityType; +-import net.minecraft.world.entity.LivingEntity; + import net.minecraft.world.entity.animal.axolotl.Axolotl; ++import net.minecraft.world.entity.player.Player; + import net.minecraft.world.item.Item; + import net.minecraft.world.item.ItemStack; + import net.minecraft.world.item.Items; +@@ -22,28 +24,40 @@ + import net.minecraft.world.item.alchemy.Potions; + import net.minecraft.world.level.Level; + import net.minecraft.world.level.block.AbstractCandleBlock; +-import net.minecraft.world.level.block.CampfireBlock; +-import net.minecraft.world.level.block.state.BlockState; ++import net.minecraft.world.level.block.state.IBlockData; + import net.minecraft.world.phys.AABB; + import net.minecraft.world.phys.BlockHitResult; + import net.minecraft.world.phys.EntityHitResult; + import net.minecraft.world.phys.HitResult; ++// CraftBukkit start ++import java.util.HashMap; ++import java.util.Map; ++import net.minecraft.world.effect.MobEffects; ++import net.minecraft.world.level.block.Blocks; ++import net.minecraft.world.level.block.CampfireBlock; ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.entity.LivingEntity; ++// CraftBukkit end + + public class ThrownPotion extends ThrowableItemProjectile implements ItemSupplier { +- public static final double SPLASH_RANGE = 4.0; +- private static final double SPLASH_RANGE_SQ = 16.0; +- public static final Predicate<LivingEntity> WATER_SENSITIVE_OR_ON_FIRE = livingEntity -> livingEntity.isSensitiveToWater() || livingEntity.isOnFire(); + ++ public static final double SPLASH_RANGE = 4.0D; ++ private static final double SPLASH_RANGE_SQ = 16.0D; ++ public static final Predicate<net.minecraft.world.entity.LivingEntity> WATER_SENSITIVE_OR_ON_FIRE = (entityliving) -> { ++ return entityliving.isSensitiveToWater() || entityliving.isOnFire(); ++ }; ++ + public ThrownPotion(EntityType<? extends ThrownPotion> entityType, Level level) { + super(entityType, level); + } + +- public ThrownPotion(Level level, LivingEntity shooter) { ++ public ThrownPotion(Level level, net.minecraft.world.entity.LivingEntity shooter) { + super(EntityType.POTION, shooter, level); + } + +- public ThrownPotion(Level level, double x, double y, double z) { +- super(EntityType.POTION, x, y, z, level); ++ public ThrownPotion(Level level, double x, double d1, double y) { ++ super(EntityType.POTION, x, d1, y, level); + } + + @Override +@@ -60,21 +74,26 @@ + protected void onHitBlock(BlockHitResult result) { + super.onHitBlock(result); + if (!this.level().isClientSide) { +- ItemStack item = this.getItem(); +- Potion potion = PotionUtils.getPotion(item); +- List<MobEffectInstance> mobEffects = PotionUtils.getMobEffects(item); +- boolean flag = potion == Potions.WATER && mobEffects.isEmpty(); +- Direction direction = result.getDirection(); +- BlockPos blockPos = result.getBlockPos(); +- BlockPos blockPos1 = blockPos.relative(direction); ++ ItemStack itemstack = this.getItem(); ++ Potion potionregistry = PotionUtils.getPotion(itemstack); ++ List<MobEffectInstance> list = PotionUtils.getMobEffects(itemstack); ++ boolean flag = potionregistry == Potions.WATER && list.isEmpty(); ++ Direction enumdirection = result.getDirection(); ++ BlockPos blockposition = result.getBlockPos(); ++ BlockPos blockposition1 = blockposition.relative(enumdirection); ++ + if (flag) { +- this.dowseFire(blockPos1); +- this.dowseFire(blockPos1.relative(direction.getOpposite())); ++ this.dowseFire(blockposition1); ++ this.dowseFire(blockposition1.relative(enumdirection.getOpposite())); ++ Iterator iterator = Direction.Plane.HORIZONTAL.iterator(); + +- for (Direction direction1 : Direction.Plane.HORIZONTAL) { +- this.dowseFire(blockPos1.relative(direction1)); ++ while (iterator.hasNext()) { ++ Direction enumdirection1 = (Direction) iterator.next(); ++ ++ this.dowseFire(blockposition1.relative(enumdirection1)); + } + } ++ + } + } + +@@ -82,123 +101,199 @@ + protected void onHit(HitResult result) { + super.onHit(result); + if (!this.level().isClientSide) { +- ItemStack item = this.getItem(); +- Potion potion = PotionUtils.getPotion(item); +- List<MobEffectInstance> mobEffects = PotionUtils.getMobEffects(item); +- boolean flag = potion == Potions.WATER && mobEffects.isEmpty(); ++ ItemStack itemstack = this.getItem(); ++ Potion potionregistry = PotionUtils.getPotion(itemstack); ++ List<MobEffectInstance> list = PotionUtils.getMobEffects(itemstack); ++ boolean flag = potionregistry == Potions.WATER && list.isEmpty(); ++ + if (flag) { + this.applyWater(); +- } else if (!mobEffects.isEmpty()) { ++ } else if (true || !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply + if (this.isLingering()) { +- this.makeAreaOfEffectCloud(item, potion); ++ this.makeAreaOfEffectCloud(itemstack, potionregistry, result); // CraftBukkit - Pass MovingObjectPosition + } else { +- this.applySplash(mobEffects, result.getType() == HitResult.Type.ENTITY ? ((EntityHitResult)result).getEntity() : null); ++ this.applySplash(list, result.getType() == HitResult.EnumMovingObjectType.ENTITY ? ((EntityHitResult) result).getEntity() : null, result); // CraftBukkit - Pass MovingObjectPosition + } + } + +- int i = potion.hasInstantEffects() ? 2007 : 2002; +- this.level().levelEvent(i, this.blockPosition(), PotionUtils.getColor(item)); ++ int i = potionregistry.hasInstantEffects() ? 2007 : 2002; ++ ++ this.level().levelEvent(i, this.blockPosition(), PotionUtils.getColor(itemstack)); + this.discard(); + } + } + + private void applyWater() { +- AABB aABB = this.getBoundingBox().inflate(4.0, 2.0, 4.0); ++ AABB axisalignedbb = this.getBoundingBox().inflate(4.0D, 2.0D, 4.0D); ++ List<net.minecraft.world.entity.LivingEntity> list = this.level().getEntitiesOfClass(net.minecraft.world.entity.LivingEntity.class, axisalignedbb, ThrownPotion.WATER_SENSITIVE_OR_ON_FIRE); ++ Iterator iterator = list.iterator(); + +- for (LivingEntity livingEntity : this.level().getEntitiesOfClass(LivingEntity.class, aABB, WATER_SENSITIVE_OR_ON_FIRE)) { +- double d = this.distanceToSqr(livingEntity); +- if (d < 16.0) { +- if (livingEntity.isSensitiveToWater()) { +- livingEntity.hurt(this.damageSources().indirectMagic(this, this.getOwner()), 1.0F); ++ while (iterator.hasNext()) { ++ net.minecraft.world.entity.LivingEntity entityliving = (net.minecraft.world.entity.LivingEntity) iterator.next(); ++ double d0 = this.distanceToSqr((Entity) entityliving); ++ ++ if (d0 < 16.0D) { ++ if (entityliving.isSensitiveToWater()) { ++ entityliving.hurt(this.damageSources().indirectMagic(this, this.getOwner()), 1.0F); + } + +- if (livingEntity.isOnFire() && livingEntity.isAlive()) { +- livingEntity.extinguishFire(); ++ if (entityliving.isOnFire() && entityliving.isAlive()) { ++ entityliving.extinguishFire(); + } + } + } + +- for (Axolotl axolotl : this.level().getEntitiesOfClass(Axolotl.class, aABB)) { ++ List<Axolotl> list1 = this.level().getEntitiesOfClass(Axolotl.class, axisalignedbb); ++ Iterator iterator1 = list1.iterator(); ++ ++ while (iterator1.hasNext()) { ++ Axolotl axolotl = (Axolotl) iterator1.next(); ++ + axolotl.rehydrate(); + } ++ + } + +- private void applySplash(List<MobEffectInstance> effectInstances, @Nullable Entity target) { +- AABB aABB = this.getBoundingBox().inflate(4.0, 2.0, 4.0); +- List<LivingEntity> entitiesOfClass = this.level().getEntitiesOfClass(LivingEntity.class, aABB); +- if (!entitiesOfClass.isEmpty()) { +- Entity effectSource = this.getEffectSource(); ++ private void applySplash(List<MobEffectInstance> list, @Nullable Entity entity, HitResult position) { // CraftBukkit - Pass MovingObjectPosition ++ AABB axisalignedbb = this.getBoundingBox().inflate(4.0D, 2.0D, 4.0D); ++ List<net.minecraft.world.entity.LivingEntity> list1 = this.level().getEntitiesOfClass(net.minecraft.world.entity.LivingEntity.class, axisalignedbb); ++ Map<LivingEntity, Double> affected = new HashMap<LivingEntity, Double>(); // CraftBukkit + +- for (LivingEntity livingEntity : entitiesOfClass) { +- if (livingEntity.isAffectedByPotions()) { +- double d = this.distanceToSqr(livingEntity); +- if (d < 16.0) { ++ if (!list1.isEmpty()) { ++ Entity entity1 = this.getEffectSource(); ++ Iterator iterator = list1.iterator(); ++ ++ while (iterator.hasNext()) { ++ net.minecraft.world.entity.LivingEntity entityliving = (net.minecraft.world.entity.LivingEntity) iterator.next(); ++ ++ if (entityliving.isAffectedByPotions()) { ++ double d0 = this.distanceToSqr((Entity) entityliving); ++ ++ if (d0 < 16.0D) { + double d1; +- if (livingEntity == target) { +- d1 = 1.0; ++ ++ if (entityliving == entity) { ++ d1 = 1.0D; + } else { +- d1 = 1.0 - Math.sqrt(d) / 4.0; ++ d1 = 1.0D - Math.sqrt(d0) / 4.0D; + } + +- for (MobEffectInstance mobEffectInstance : effectInstances) { +- MobEffect effect = mobEffectInstance.getEffect(); +- if (effect.isInstantenous()) { +- effect.applyInstantenousEffect(this, this.getOwner(), livingEntity, mobEffectInstance.getAmplifier(), d1); +- } else { +- int i = mobEffectInstance.mapDuration(i1 -> (int)(d1 * (double)i1 + 0.5)); +- MobEffectInstance mobEffectInstance1 = new MobEffectInstance( +- effect, i, mobEffectInstance.getAmplifier(), mobEffectInstance.isAmbient(), mobEffectInstance.isVisible() +- ); +- if (!mobEffectInstance1.endsWithin(20)) { +- livingEntity.addEffect(mobEffectInstance1, effectSource); +- } +- } ++ // CraftBukkit start ++ affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); ++ } ++ } ++ } ++ } ++ ++ org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, position, affected); ++ if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process ++ Entity entity1 = this.getEffectSource(); ++ for (LivingEntity victim : event.getAffectedEntities()) { ++ if (!(victim instanceof CraftLivingEntity)) { ++ continue; ++ } ++ ++ net.minecraft.world.entity.LivingEntity entityliving = ((CraftLivingEntity) victim).getHandle(); ++ double d1 = event.getIntensity(victim); ++ // CraftBukkit end ++ ++ Iterator iterator1 = list.iterator(); ++ ++ while (iterator1.hasNext()) { ++ MobEffectInstance mobeffect = (MobEffectInstance) iterator1.next(); ++ MobEffect mobeffectlist = mobeffect.getEffect(); ++ // CraftBukkit start - Abide by PVP settings - for players only! ++ if (!this.level().pvpMode && this.getOwner() instanceof ServerPlayer && entityliving instanceof ServerPlayer && entityliving != this.getOwner()) { ++ if (mobeffectlist == MobEffects.MOVEMENT_SLOWDOWN || mobeffectlist == MobEffects.DIG_SLOWDOWN || mobeffectlist == MobEffects.HARM || mobeffectlist == MobEffects.BLINDNESS ++ || mobeffectlist == MobEffects.HUNGER || mobeffectlist == MobEffects.WEAKNESS || mobeffectlist == MobEffects.POISON) { ++ continue; + } + } ++ // CraftBukkit end ++ ++ if (mobeffectlist.isInstantenous()) { ++ mobeffectlist.applyInstantenousEffect(this, this.getOwner(), entityliving, mobeffect.getAmplifier(), d1); ++ } else { ++ int i = mobeffect.mapDuration((j) -> { ++ return (int) (d1 * (double) j + 0.5D); ++ }); ++ MobEffectInstance mobeffect1 = new MobEffectInstance(mobeffectlist, i, mobeffect.getAmplifier(), mobeffect.isAmbient(), mobeffect.isVisible()); ++ ++ if (!mobeffect1.endsWithin(20)) { ++ entityliving.addEffect(mobeffect1, entity1, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.POTION_SPLASH); // CraftBukkit ++ } ++ } + } + } + } ++ + } + +- private void makeAreaOfEffectCloud(ItemStack stack, Potion potion) { +- AreaEffectCloud areaEffectCloud = new AreaEffectCloud(this.level(), this.getX(), this.getY(), this.getZ()); +- Entity owner = this.getOwner(); +- if (owner instanceof LivingEntity) { +- areaEffectCloud.setOwner((LivingEntity)owner); ++ private void makeAreaOfEffectCloud(ItemStack itemstack, Potion potionregistry, HitResult position) { // CraftBukkit - Pass MovingObjectPosition ++ AreaEffectCloud entityareaeffectcloud = new AreaEffectCloud(this.level(), this.getX(), this.getY(), this.getZ()); ++ Entity entity = this.getOwner(); ++ ++ if (entity instanceof net.minecraft.world.entity.LivingEntity) { ++ entityareaeffectcloud.setOwner((net.minecraft.world.entity.LivingEntity) entity); + } + +- areaEffectCloud.setRadius(3.0F); +- areaEffectCloud.setRadiusOnUse(-0.5F); +- areaEffectCloud.setWaitTime(10); +- areaEffectCloud.setRadiusPerTick(-areaEffectCloud.getRadius() / (float)areaEffectCloud.getDuration()); +- areaEffectCloud.setPotion(potion); ++ entityareaeffectcloud.setRadius(3.0F); ++ entityareaeffectcloud.setRadiusOnUse(-0.5F); ++ entityareaeffectcloud.setWaitTime(10); ++ entityareaeffectcloud.setRadiusPerTick(-entityareaeffectcloud.getRadius() / (float) entityareaeffectcloud.getDuration()); ++ entityareaeffectcloud.setPotion(potionregistry); ++ Iterator iterator = PotionUtils.getCustomEffects(itemstack).iterator(); + +- for (MobEffectInstance mobEffectInstance : PotionUtils.getCustomEffects(stack)) { +- areaEffectCloud.addEffect(new MobEffectInstance(mobEffectInstance)); ++ while (iterator.hasNext()) { ++ MobEffectInstance mobeffect = (MobEffectInstance) iterator.next(); ++ ++ entityareaeffectcloud.addEffect(new MobEffectInstance(mobeffect)); + } + +- CompoundTag tag = stack.getTag(); +- if (tag != null && tag.contains("CustomPotionColor", 99)) { +- areaEffectCloud.setFixedColor(tag.getInt("CustomPotionColor")); ++ CompoundTag nbttagcompound = itemstack.getTag(); ++ ++ if (nbttagcompound != null && nbttagcompound.contains("CustomPotionColor", 99)) { ++ entityareaeffectcloud.setFixedColor(nbttagcompound.getInt("CustomPotionColor")); + } + +- this.level().addFreshEntity(areaEffectCloud); ++ // CraftBukkit start ++ org.bukkit.event.entity.LingeringPotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callLingeringPotionSplashEvent(this, position, entityareaeffectcloud); ++ if (!(event.isCancelled() || entityareaeffectcloud.isRemoved())) { ++ this.level().addFreshEntity(entityareaeffectcloud); ++ } else { ++ entityareaeffectcloud.discard(); ++ } ++ // CraftBukkit end + } + +- private boolean isLingering() { ++ public boolean isLingering() { + return this.getItem().is(Items.LINGERING_POTION); + } + + private void dowseFire(BlockPos pos) { +- BlockState blockState = this.level().getBlockState(pos); +- if (blockState.is(BlockTags.FIRE)) { +- this.level().destroyBlock(pos, false, this); +- } else if (AbstractCandleBlock.isLit(blockState)) { +- AbstractCandleBlock.extinguish(null, blockState, this.level(), pos); +- } else if (CampfireBlock.isLitCampfire(blockState)) { +- this.level().levelEvent(null, 1009, pos, 0); +- CampfireBlock.dowse(this.getOwner(), this.level(), pos, blockState); +- this.level().setBlockAndUpdate(pos, blockState.setValue(CampfireBlock.LIT, Boolean.valueOf(false))); ++ IBlockData iblockdata = this.level().getBlockState(pos); ++ ++ if (iblockdata.is(BlockTags.FIRE)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, pos, Blocks.AIR.defaultBlockState())) { ++ this.level().destroyBlock(pos, false, this); ++ } ++ // CraftBukkit end ++ } else if (AbstractCandleBlock.isLit(iblockdata)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, pos, iblockdata.setValue(AbstractCandleBlock.LIT, false))) { ++ AbstractCandleBlock.extinguish((Player) null, iblockdata, this.level(), pos); ++ } ++ // CraftBukkit end ++ } else if (CampfireBlock.isLitCampfire(iblockdata)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, pos, iblockdata.setValue(CampfireBlock.LIT, false))) { ++ this.level().levelEvent((Player) null, 1009, pos, 0); ++ CampfireBlock.dowse(this.getOwner(), this.level(), pos, iblockdata); ++ this.level().setBlockAndUpdate(pos, (IBlockData) iblockdata.setValue(CampfireBlock.LIT, false)); ++ } ++ // CraftBukkit end + } ++ + } + } |