aboutsummaryrefslogtreecommitdiffhomepage
path: root/patch-remap/og/net/minecraft/world/entity/monster/EntityCreeper.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patch-remap/og/net/minecraft/world/entity/monster/EntityCreeper.patch')
-rw-r--r--patch-remap/og/net/minecraft/world/entity/monster/EntityCreeper.patch83
1 files changed, 83 insertions, 0 deletions
diff --git a/patch-remap/og/net/minecraft/world/entity/monster/EntityCreeper.patch b/patch-remap/og/net/minecraft/world/entity/monster/EntityCreeper.patch
new file mode 100644
index 0000000000..4a1e9252c6
--- /dev/null
+++ b/patch-remap/og/net/minecraft/world/entity/monster/EntityCreeper.patch
@@ -0,0 +1,83 @@
+--- a/net/minecraft/world/entity/monster/EntityCreeper.java
++++ b/net/minecraft/world/entity/monster/EntityCreeper.java
+@@ -43,6 +43,12 @@
+ import net.minecraft.world.level.World;
+ import net.minecraft.world.level.gameevent.GameEvent;
+
++// CraftBukkit start;
++import org.bukkit.event.entity.CreatureSpawnEvent;
++import org.bukkit.craftbukkit.event.CraftEventFactory;
++import org.bukkit.event.entity.ExplosionPrimeEvent;
++// CraftBukkit end
++
+ public class EntityCreeper extends EntityMonster implements PowerableMob {
+
+ private static final DataWatcherObject<Integer> DATA_SWELL_DIR = DataWatcher.defineId(EntityCreeper.class, DataWatcherRegistry.INT);
+@@ -218,9 +224,20 @@
+ @Override
+ public void thunderHit(WorldServer worldserver, EntityLightning entitylightning) {
+ super.thunderHit(worldserver, entitylightning);
++ // CraftBukkit start
++ if (CraftEventFactory.callCreeperPowerEvent(this, entitylightning, org.bukkit.event.entity.CreeperPowerEvent.PowerCause.LIGHTNING).isCancelled()) {
++ return;
++ }
++ // CraftBukkit end
+ this.entityData.set(EntityCreeper.DATA_IS_POWERED, true);
+ }
+
++ // CraftBukkit start
++ public void setPowered(boolean powered) {
++ this.entityData.set(EntityCreeper.DATA_IS_POWERED, powered);
++ }
++ // CraftBukkit end
++
+ @Override
+ protected EnumInteractionResult mobInteract(EntityHuman entityhuman, EnumHand enumhand) {
+ ItemStack itemstack = entityhuman.getItemInHand(enumhand);
+@@ -231,7 +248,7 @@
+ this.level().playSound(entityhuman, this.getX(), this.getY(), this.getZ(), soundeffect, this.getSoundSource(), 1.0F, this.random.nextFloat() * 0.4F + 0.8F);
+ if (!this.level().isClientSide) {
+ this.ignite();
+- if (!itemstack.isDamageableItem()) {
++ if (itemstack.getItem().getMaxDamage() == 0) { // CraftBukkit - fix MC-264285: unbreakable flint and steels are completely consumed when igniting a creeper
+ itemstack.shrink(1);
+ } else {
+ itemstack.hurtAndBreak(1, entityhuman, (entityhuman1) -> {
+@@ -250,10 +267,19 @@
+ if (!this.level().isClientSide) {
+ float f = this.isPowered() ? 2.0F : 1.0F;
+
++ // CraftBukkit start
++ ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, this.explosionRadius * f, false);
++ if (!event.isCancelled()) {
++ // CraftBukkit end
+ this.dead = true;
+- this.level().explode(this, this.getX(), this.getY(), this.getZ(), (float) this.explosionRadius * f, World.a.MOB);
++ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); // CraftBukkit
+ this.discard();
+ this.spawnLingeringCloud();
++ // CraftBukkit start
++ } else {
++ swell = 0;
++ }
++ // CraftBukkit end
+ }
+
+ }
+@@ -264,6 +290,7 @@
+ if (!collection.isEmpty()) {
+ EntityAreaEffectCloud entityareaeffectcloud = new EntityAreaEffectCloud(this.level(), this.getX(), this.getY(), this.getZ());
+
++ entityareaeffectcloud.setOwner(this); // CraftBukkit
+ entityareaeffectcloud.setRadius(2.5F);
+ entityareaeffectcloud.setRadiusOnUse(-0.5F);
+ entityareaeffectcloud.setWaitTime(10);
+@@ -277,7 +304,7 @@
+ entityareaeffectcloud.addEffect(new MobEffect(mobeffect));
+ }
+
+- this.level().addFreshEntity(entityareaeffectcloud);
++ this.level().addFreshEntity(entityareaeffectcloud, CreatureSpawnEvent.SpawnReason.EXPLOSION); // CraftBukkit
+ }
+
+ }