aboutsummaryrefslogtreecommitdiffhomepage
path: root/patch-remap/mache-vineflower/net/minecraft/world/entity/projectile/ThrownPotion.java.patch
diff options
context:
space:
mode:
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.patch381
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
+ }
++
+ }
+ }