Skip to content

Commit f2cc443

Browse files
committed
feat:some patches
1 parent f36d482 commit f2cc443

7 files changed

Lines changed: 135 additions & 121 deletions

File tree

nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.patch

Lines changed: 0 additions & 57 deletions
This file was deleted.

nms-patches/net/minecraft/world/entity/boss/enderdragon/phases/DragonControllerLandedFlame.patch

Lines changed: 0 additions & 22 deletions
This file was deleted.

nms-patches/net/minecraft/world/entity/boss/enderdragon/phases/DragonControllerManager.patch

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.teneted.neotenet.mixin.world.entity.boos.enderdragon.phases;
2+
3+
import net.minecraft.world.entity.AreaEffectCloud;
4+
import net.minecraft.world.entity.boss.enderdragon.phases.DragonSittingFlamingPhase;
5+
import org.bukkit.event.entity.EntityRemoveEvent;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
import javax.annotation.Nullable;
13+
14+
@Mixin(DragonSittingFlamingPhase.class)
15+
public class MixinDragonSittingFlamingPhase {
16+
17+
@Shadow
18+
@Nullable
19+
private AreaEffectCloud flame;
20+
21+
@Inject(method = "end", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/AreaEffectCloud;discard()V"))
22+
private void neotenet$pushRemoveCause(CallbackInfo ci) {
23+
this.flame.pushRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
24+
}
25+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.teneted.neotenet.mixin.world.entity.boos.enderdragon.phases;
2+
3+
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
4+
import net.minecraft.world.entity.boss.enderdragon.phases.DragonPhaseInstance;
5+
import net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhase;
6+
import net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhaseManager;
7+
import org.bukkit.craftbukkit.entity.CraftEnderDragon;
8+
import org.bukkit.event.entity.EnderDragonChangePhaseEvent;
9+
import org.spongepowered.asm.mixin.Final;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
15+
16+
import javax.annotation.Nullable;
17+
18+
@Mixin(EnderDragonPhaseManager.class)
19+
public class MixinEnderDragonPhaseManager {
20+
21+
@Shadow
22+
@Final
23+
private EnderDragon dragon;
24+
25+
@Shadow
26+
@Nullable
27+
private DragonPhaseInstance currentPhase;
28+
29+
@Inject(method = "setPhase",
30+
at = @At(value = "INVOKE",
31+
target = "Lnet/minecraft/world/entity/boss/enderdragon/phases/DragonPhaseInstance;getPhase()Lnet/minecraft/world/entity/boss/enderdragon/phases/EnderDragonPhase;"), cancellable = true)
32+
private void neotenet$callEnderDragonChangePhaseEvent(EnderDragonPhase<?> p_31417_, CallbackInfo ci) {
33+
// CraftBukkit start - Call EnderDragonChangePhaseEvent
34+
EnderDragonChangePhaseEvent event = new EnderDragonChangePhaseEvent(
35+
(CraftEnderDragon) this.dragon.getBukkitEntity(),
36+
(this.currentPhase == null) ? null : CraftEnderDragon.getBukkitPhase(this.currentPhase.getPhase()),
37+
CraftEnderDragon.getBukkitPhase(p_31417_)
38+
);
39+
this.dragon.level().getCraftServer().getPluginManager().callEvent(event);
40+
if (event.isCancelled()) {
41+
ci.cancel();
42+
return;
43+
}
44+
p_31417_ = CraftEnderDragon.getMinecraftPhase(event.getNewPhase());
45+
// CraftBukkit end
46+
}
47+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.teneted.neotenet.mixin.world.entity.boss.enderdragon;
2+
3+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
4+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
5+
import com.llamalad7.mixinextras.sugar.Cancellable;
6+
import com.llamalad7.mixinextras.sugar.Local;
7+
import net.minecraft.core.BlockPos;
8+
import net.minecraft.world.damagesource.DamageSource;
9+
import net.minecraft.world.entity.Entity;
10+
import net.minecraft.world.entity.EntityType;
11+
import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
12+
import net.minecraft.world.level.Explosion;
13+
import net.minecraft.world.level.ExplosionDamageCalculator;
14+
import net.minecraft.world.level.Level;
15+
import net.minecraft.world.level.block.state.BlockState;
16+
import org.bukkit.craftbukkit.event.CraftEventFactory;
17+
import org.bukkit.event.entity.EntityRemoveEvent;
18+
import org.bukkit.event.entity.ExplosionPrimeEvent;
19+
import org.spongepowered.asm.mixin.Mixin;
20+
import org.spongepowered.asm.mixin.injection.At;
21+
import org.spongepowered.asm.mixin.injection.Redirect;
22+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
23+
24+
@Mixin(EndCrystal.class)
25+
public abstract class MixinEndCrystal extends Entity {
26+
27+
public MixinEndCrystal(EntityType<?> p_19870_, Level p_19871_) {
28+
super(p_19870_, p_19871_);
29+
}
30+
31+
@WrapOperation(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;setBlockAndUpdate(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Z"))
32+
private boolean neotenet$callBlockIgniteEvent(Level instance, BlockPos p_46598_, BlockState p_46599_, Operation<Boolean> original) {
33+
if (!CraftEventFactory.callBlockIgniteEvent(instance, p_46598_, ((EndCrystal) (Object) this)).isCancelled()) {
34+
return original.call(instance, p_46598_, p_46599_);
35+
} else {
36+
return false;
37+
}
38+
}
39+
40+
@Redirect(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;remove(Lnet/minecraft/world/entity/Entity$RemovalReason;)V"))
41+
private void neotenet$handleNonLivingEntityDamageEvent(EndCrystal instance, Entity.RemovalReason removalReason, @Local(argsOnly = true) DamageSource p_31050_, @Local(argsOnly = true) float p_31051_, @Cancellable CallbackInfoReturnable<Boolean> cir) {
42+
// CraftBukkit start - All non-living entities need this
43+
if (CraftEventFactory.handleNonLivingEntityDamageEvent(instance, p_31050_, p_31051_, false)) {
44+
cir.setReturnValue(false);
45+
}
46+
// CraftBukkit end
47+
}
48+
49+
@Redirect(method = "hurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;Lnet/minecraft/world/level/ExplosionDamageCalculator;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;"))
50+
private Explosion neotenet$callExplosionPrimeEvent(Level instance, Entity p_256145_, DamageSource p_256004_, ExplosionDamageCalculator p_255696_, double p_256208_, double p_256036_, double p_255746_, float p_256647_, boolean p_256098_, Level.ExplosionInteraction p_256104_, @Cancellable CallbackInfoReturnable<Boolean> cir) {
51+
// CraftBukkit start
52+
ExplosionPrimeEvent event = CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false);
53+
if (event.isCancelled()) {
54+
cir.setReturnValue(false);
55+
}
56+
57+
this.remove(Entity.RemovalReason.KILLED, EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause
58+
return this.level().explode(this, p_256004_, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.BLOCK);
59+
}
60+
}

src/main/resources/neotenet.mixins.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,9 @@
167167
"world.entity.animal.horse.MixinSkeletonTrapGoal",
168168
"world.entity.animal.horse.MixinTraderLlama_FollowTraderGoal",
169169
"world.entity.animal.sniffer.MixinSniffer",
170+
"world.entity.boos.enderdragon.phases.MixinDragonSittingFlamingPhase",
171+
"world.entity.boos.enderdragon.phases.MixinEnderDragonPhaseManager",
172+
"world.entity.boss.enderdragon.MixinEndCrystal",
170173
"world.entity.decoration.MixinArmorStand",
171174
"world.entity.decoration.MixinBlockAttachedEntity",
172175
"world.entity.item.MixinFallingBlockEntity",

0 commit comments

Comments
 (0)