下面列出了net.minecraft.util.EntitySelectors#net.minecraft.entity.boss.dragon.phase.PhaseList 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onTick(LivingEvent.LivingUpdateEvent event) {
EntityLivingBase e = event.getEntityLiving();
if(e.isPotionActive(ModPotions.TIME_SLOW) && timeScale(e) == 0) {
boolean shouldFreeze = true;
if(e.isDead || e.getHealth() <= 0) {
shouldFreeze = false;
}
if(e instanceof EntityDragon && ((EntityDragon) e).getPhaseManager().getCurrentPhase().getType() == PhaseList.DYING) {
shouldFreeze = false;
}
if(shouldFreeze) {
handleImportantEntityTicks(e);
event.setCanceled(true);
}
}
}
private void updateConnectedCrystals() {
this.connectedCrystalsIds.clear();
final double maxDistance = 64 * 64;
List<EntityEnderCrystal> enderCrystals = Arrays.stream(BiomeEndDecorator.getSpikesForWorld(getWorld()))
.flatMap(endSpike -> getWorld().getEntitiesWithinAABB(EntityEnderCrystal.class, endSpike.getTopBoundingBox()).stream())
.filter(crystal -> crystal.getDistanceSq(getPos()) < maxDistance)
.collect(Collectors.toList());
for (EntityEnderCrystal entityEnderCrystal : enderCrystals) {
BlockPos beamTarget = entityEnderCrystal.getBeamTarget();
if (beamTarget == null) {
//if beam target is null, set ourselves as beam target
entityEnderCrystal.setBeamTarget(getPos());
this.connectedCrystalsIds.add(entityEnderCrystal.getEntityId());
} else if (beamTarget.equals(getPos())) {
//if beam target is ourselves, just add it to list
this.connectedCrystalsIds.add(entityEnderCrystal.getEntityId());
}
}
for (EntityDragon entityDragon : getWorld().getEntities(EntityDragon.class, EntitySelectors.IS_ALIVE)) {
if (entityDragon.healingEnderCrystal != null && connectedCrystalsIds.contains(entityDragon.healingEnderCrystal.getEntityId())) {
//if dragon is healing from crystal we draw energy from, reset it's healing crystal
entityDragon.healingEnderCrystal = null;
//if dragon is holding pattern, than deal damage and set it's phase to attack ourselves
if (entityDragon.getPhaseManager().getCurrentPhase().getType() == PhaseList.HOLDING_PATTERN) {
entityDragon.attackEntityFrom(DamageSource.causeExplosionDamage((EntityLivingBase) null), 10.0f);
entityDragon.getPhaseManager().setPhase(PhaseList.CHARGING_PLAYER);
((PhaseChargingPlayer) entityDragon.getPhaseManager().getCurrentPhase()).setTarget(new Vec3d(getPos()));
}
}
}
}
private static void handleImportantEntityTicks(EntityLivingBase e) {
if (e.hurtTime > 0) {
e.hurtTime--;
}
if (e.hurtResistantTime > 0) {
e.hurtResistantTime--;
}
e.prevLimbSwingAmount = e.limbSwingAmount;
e.prevRenderYawOffset = e.renderYawOffset;
e.prevRotationPitch = e.rotationPitch;
e.prevRotationYaw = e.rotationYaw;
e.prevRotationYawHead = e.rotationYawHead;
e.prevSwingProgress = e.swingProgress;
e.prevDistanceWalkedModified = e.distanceWalkedModified;
e.prevCameraPitch = e.cameraPitch;
if(e.isPotionActive(ModPotions.TIME_SLOW) && timeScale(e) == 0) {
PotionEffect pe = e.getActivePotionEffect(ModPotions.TIME_SLOW);
if (!pe.onUpdate(e)) {
if (!e.world.isRemote) {
e.removePotionEffect(ModPotions.TIME_SLOW);
}
}
}
if(e instanceof EntityDragon) {
IPhase phase = ((EntityDragon) e).getPhaseManager().getCurrentPhase();
if(phase.getType() != PhaseList.HOLDING_PATTERN && phase.getType() != PhaseList.DYING) {
((EntityDragon) e).getPhaseManager().setPhase(PhaseList.HOLDING_PATTERN);
}
}
}
public static Phase getBukkitPhase(PhaseList phase) {
return Phase.values()[phase.getId()];
}
public static PhaseList getMinecraftPhase(Phase phase) {
return PhaseList.getById(phase.ordinal());
}