use of com.flowpowered.math.vector.Vector3d in project Skree by Skelril.
the class ShnugglesPrimeInstance method runAttack.
public void runAttack(ShnugglesPrimeAttack attackCase) {
Optional<Giant> optBoss = getBoss();
if (!optBoss.isPresent()) {
return;
}
Giant boss = optBoss.get();
double bossHealth = getHealth(boss);
double maxBossHealth = getMaxHealth(boss);
double delay = 15000;
if (lastAttackTime != 0 && System.currentTimeMillis() - lastAttackTime <= delay) {
return;
}
Collection<Player> contained = getPlayers(PARTICIPANT);
if (contained.isEmpty()) {
return;
}
// AI-ish system
if ((attackCase == ShnugglesPrimeAttack.EVERLASTING || attackCase == ShnugglesPrimeAttack.MINION_LEECH) && bossHealth > maxBossHealth * .9) {
attackCase = Probability.getChance(2) ? ShnugglesPrimeAttack.DARK_POTIONS : ShnugglesPrimeAttack.CORRUPTION;
}
for (Player player : contained) {
if (player.get(Keys.HEALTH).get() < 4) {
attackCase = ShnugglesPrimeAttack.CORRUPTION;
break;
}
}
Collection<Zombie> zombies = getContained(Zombie.class);
if (zombies.size() > 200) {
attackCase = ShnugglesPrimeAttack.BASK_IN_MY_GLORY;
}
if (bossHealth < maxBossHealth * .4 && Probability.getChance(5)) {
if (zombies.size() < 100 && bossHealth > 200) {
attackCase = ShnugglesPrimeAttack.EVERLASTING;
} else {
attackCase = ShnugglesPrimeAttack.MINION_LEECH;
}
}
if ((attackCase == ShnugglesPrimeAttack.BLINDNESS || attackCase == ShnugglesPrimeAttack.FIRE) && bossHealth < maxBossHealth * .15) {
runRandomAttack();
return;
}
switch(attackCase) {
case WRATH:
sendAttackBroadcast("Taste my wrath!", AttackSeverity.NORMAL);
for (Player player : contained) {
player.offer(Keys.VELOCITY, new Vector3d(random.nextDouble() * 3 - 1.5, random.nextDouble() * 1 + .5, random.nextDouble() * 3 - 1.5));
player.offer(Keys.FIRE_TICKS, 20 * 3);
}
break;
case CORRUPTION:
sendAttackBroadcast("Embrace my corruption!", AttackSeverity.NORMAL);
PotionEffect witherEffect = PotionEffect.of(PotionEffectTypes.WITHER, 1, 20 * 3);
for (Player player : contained) {
List<PotionEffect> potionEffects = player.getOrElse(Keys.POTION_EFFECTS, new ArrayList<>(1));
potionEffects.add(witherEffect);
player.offer(Keys.POTION_EFFECTS, potionEffects);
}
break;
case BLINDNESS:
sendAttackBroadcast("Are you BLIND? Mwhahahaha!", AttackSeverity.NORMAL);
PotionEffect blindnessEffect = PotionEffect.of(PotionEffectTypes.BLINDNESS, 0, 20 * 4);
for (Player player : contained) {
List<PotionEffect> potionEffects = player.getOrElse(Keys.POTION_EFFECTS, new ArrayList<>(1));
potionEffects.add(blindnessEffect);
player.offer(Keys.POTION_EFFECTS, potionEffects);
}
break;
case TANGO_TIME:
sendAttackBroadcast("Tango time!", AttackSeverity.ULTIMATE);
activeAttacks.add(ShnugglesPrimeAttack.TANGO_TIME);
Task.builder().delay(7, TimeUnit.SECONDS).execute(() -> {
if (!isBossSpawned())
return;
for (Player player : getPlayers(PARTICIPANT)) {
// TODO Convert to Sponge
if (((EntityGiantZombie) boss).canEntityBeSeen(tf(player))) {
player.sendMessage(Text.of(TextColors.YELLOW, "Come closer..."));
player.setLocation(boss.getLocation());
EntityDamageSource source = EntityDamageSource.builder().entity(boss).type(DamageTypes.ATTACK).build();
player.damage(100, source, Cause.source(boss).build());
player.offer(Keys.VELOCITY, new Vector3d(random.nextDouble() * 1.7 - 1.5, random.nextDouble() * 2, random.nextDouble() * 1.7 - 1.5));
} else {
player.sendMessage(Text.of(TextColors.YELLOW, "Fine... No tango this time..."));
}
}
sendAttackBroadcast("Now wasn't that fun?", AttackSeverity.INFO);
activeAttacks.remove(ShnugglesPrimeAttack.TANGO_TIME);
}).submit(SkreePlugin.inst());
break;
case EVERLASTING:
if (!damageHeals) {
activeAttacks.add(ShnugglesPrimeAttack.EVERLASTING);
sendAttackBroadcast("I am everlasting!", AttackSeverity.NORMAL);
damageHeals = true;
Task.builder().delay(12, TimeUnit.SECONDS).execute(() -> {
if (damageHeals) {
damageHeals = false;
if (!isBossSpawned())
return;
sendAttackBroadcast("Thank you for your assistance.", AttackSeverity.INFO);
}
activeAttacks.remove(ShnugglesPrimeAttack.EVERLASTING);
}).submit(SkreePlugin.inst());
break;
}
runRandomAttack();
return;
case FIRE:
sendAttackBroadcast("Fire is your friend...", AttackSeverity.NORMAL);
for (Player player : contained) {
player.offer(Keys.FIRE_TICKS, 20 * 5);
}
break;
case BASK_IN_MY_GLORY:
if (!damageHeals) {
sendAttackBroadcast("Bask in my glory!", AttackSeverity.ULTIMATE);
activeAttacks.add(ShnugglesPrimeAttack.BASK_IN_MY_GLORY);
Task.builder().delay(7, TimeUnit.SECONDS).execute(() -> {
if (!isBossSpawned())
return;
boolean baskInGlory = false;
for (Player player : getContained(Player.class)) {
// TODO Convert to Sponge
if (((EntityGiantZombie) boss).canEntityBeSeen(tf(player))) {
player.sendMessage(Text.of(TextColors.DARK_RED, "You!"));
baskInGlory = true;
}
}
//Attack
if (baskInGlory) {
damageHeals = true;
spawnPts.stream().filter(pt -> Probability.getChance(12)).forEach(pt -> {
Explosion explosion = Explosion.builder().shouldDamageEntities(true).location(pt).radius(10).build();
getRegion().getExtent().triggerExplosion(explosion, Cause.source(SkreePlugin.container()).owner(boss).build());
});
//Schedule Reset
Task.builder().delay(500, TimeUnit.MILLISECONDS).execute(() -> {
damageHeals = false;
}).submit(SkreePlugin.inst());
return;
}
// Notify if avoided
sendAttackBroadcast("Gah... Afraid are you friends?", AttackSeverity.INFO);
activeAttacks.remove(ShnugglesPrimeAttack.BASK_IN_MY_GLORY);
}).submit(SkreePlugin.inst());
break;
}
runRandomAttack();
break;
case DARK_POTIONS:
sendAttackBroadcast("Unleash the inner darkness!", AttackSeverity.NORMAL);
PotionEffect instantDamageEffect = PotionEffect.of(PotionEffectTypes.INSTANT_DAMAGE, 0, 1);
for (Living entity : getContained(Zombie.class)) {
if (!Probability.getChance(5)) {
continue;
}
entity.offer(Keys.HEALTH, 0D);
Location targetLoc = entity.getLocation();
Entity potion = getRegion().getExtent().createEntity(EntityTypes.SPLASH_POTION, targetLoc.getPosition());
potion.offer(Keys.POTION_EFFECTS, Lists.newArrayList(instantDamageEffect));
getRegion().getExtent().spawnEntity(potion, Cause.source(SpawnCause.builder().type(SpawnTypes.PLUGIN).build()).build());
}
return;
case MINION_LEECH:
sendAttackBroadcast("My minions our time is now!", AttackSeverity.ULTIMATE);
activeAttacks.add(ShnugglesPrimeAttack.MINION_LEECH);
IntegratedRunnable minionEater = new IntegratedRunnable() {
@Override
public boolean run(int times) {
if (!isBossSpawned())
return true;
for (Living entity : getContained(Living.class)) {
// TODO convert to Sponge
if (entity instanceof Giant || !Probability.getChance(5) || !((EntityGiantZombie) boss).canEntityBeSeen((EntityLivingBase) entity)) {
continue;
}
double realDamage = entity.get(Keys.HEALTH).get();
// TODO convert to Sponge
if (entity instanceof Zombie && ((EntityZombie) entity).isChild()) {
entity.offer(Keys.HEALTH, 0D);
} else {
DamageSource source = DamageSource.builder().type(DamageTypes.ATTACK).build();
entity.damage(realDamage, source, Cause.source(boss).build());
}
toHeal += Math.min(1, realDamage / 3);
}
if (new TimeFilter(-1, 2).matchesFilter(times + 1)) {
getPlayerMessageChannel(SPECTATOR).send(Text.of(TextColors.DARK_AQUA, "The boss has drawn in: " + (int) toHeal + " health."));
}
return true;
}
@Override
public void end() {
if (!isBossSpawned())
return;
heal(boss, toHeal);
toHeal = 0;
sendAttackBroadcast("Thank you my minions!", AttackSeverity.INFO);
printBossHealth();
activeAttacks.remove(ShnugglesPrimeAttack.MINION_LEECH);
}
};
TimedRunnable<IntegratedRunnable> minonEatingTask = new TimedRunnable<>(minionEater, 20);
Task minionEatingTaskExecutor = Task.builder().interval(500, TimeUnit.MILLISECONDS).execute(minonEatingTask).submit(SkreePlugin.inst());
minonEatingTask.setTask(minionEatingTaskExecutor);
break;
}
lastAttackTime = System.currentTimeMillis();
lastAttack = attackCase;
}
use of com.flowpowered.math.vector.Vector3d in project Skree by Skelril.
the class ShnugglesPrimeManager method setupBossManager.
private void setupBossManager() {
Sponge.getEventManager().registerListeners(SkreePlugin.inst(), new BossListener<>(bossManager, Giant.class));
List<Instruction<BindCondition, Boss<Giant, ZoneBossDetail<ShnugglesPrimeInstance>>>> bindProcessor = bossManager.getBindProcessor();
bindProcessor.add((condition, boss) -> {
Optional<Giant> optBossEnt = boss.getTargetEntity();
if (optBossEnt.isPresent()) {
Giant bossEnt = optBossEnt.get();
bossEnt.offer(Keys.DISPLAY_NAME, Text.of("Shnuggles Prime"));
setMaxHealth(bossEnt, 750, true);
}
return Optional.empty();
});
bindProcessor.add((condition, boss) -> {
Optional<Giant> optBoss = boss.getTargetEntity();
if (optBoss.isPresent()) {
optBoss.get().offer(Keys.PERSISTS, true);
}
return Optional.empty();
});
bindProcessor.add((condition, boss) -> {
boss.getDetail().getZone().getPlayerMessageChannel(PlayerClassifier.SPECTATOR).send(Text.of(TextColors.GOLD, "I live again!"));
return Optional.empty();
});
List<Instruction<UnbindCondition, Boss<Giant, ZoneBossDetail<ShnugglesPrimeInstance>>>> unbindProcessor = bossManager.getUnbindProcessor();
unbindProcessor.add((condition, boss) -> {
ShnugglesPrimeInstance inst = boss.getDetail().getZone();
// Reset respawn mechanics
inst.bossDied();
// Buff babies
inst.buffBabies();
return Optional.empty();
});
unbindProcessor.add((condition, boss) -> {
ShnugglesPrimeInstance inst = boss.getDetail().getZone();
int playerCount = inst.getPlayers(PlayerClassifier.PARTICIPANT).size();
Collection<ItemStack> drops = dropTable.getDrops(Math.min(7000, playerCount * 1500), 1);
Optional<Giant> optEnt = boss.getTargetEntity();
if (optEnt.isPresent()) {
Task.builder().execute(() -> {
new ItemDropper(optEnt.get().getLocation()).dropStacks(drops, SpawnTypes.DROPPED_ITEM);
}).delayTicks(1).submit(SkreePlugin.inst());
}
return Optional.empty();
});
List<Instruction<DamagedCondition, Boss<Giant, ZoneBossDetail<ShnugglesPrimeInstance>>>> damagedProcessor = bossManager.getDamagedProcessor();
damagedProcessor.add((condition, boss) -> {
ShnugglesPrimeInstance inst = boss.getDetail().getZone();
DamageEntityEvent event = condition.getEvent();
// Schedule a task to change the display name to show HP
Task.builder().execute(inst::printBossHealth).delayTicks(1).submit(SkreePlugin.inst());
if (inst.damageHeals()) {
if (inst.isActiveAttack(ShnugglesPrimeAttack.BASK_IN_MY_GLORY)) {
if (boss.getTargetEntity().isPresent()) {
toFullHealth(boss.getTargetEntity().get());
}
} else {
double healedDamage = event.getFinalDamage() * 2;
if (boss.getTargetEntity().isPresent()) {
heal(boss.getTargetEntity().get(), healedDamage);
}
}
event.setBaseDamage(0);
if (Probability.getChance(3) && event.getCause().first(Player.class).isPresent()) {
int affected = 0;
if (boss.getTargetEntity().isPresent()) {
for (Entity e : boss.getTargetEntity().get().getNearbyEntities(8)) {
if (e.isLoaded() && !e.isRemoved() && e instanceof Player && inst.contains(e)) {
e.setVelocity(new Vector3d(Math.random() * 3 - 1.5, Math.random() * 4, Math.random() * 3 - 1.5));
e.offer(Keys.FIRE_TICKS, Probability.getRandom(20 * 60));
++affected;
}
}
}
if (affected > 0) {
inst.sendAttackBroadcast("Feel my power!", AttackSeverity.INFO);
}
}
}
Optional<DamageSource> optDmgSource = condition.getDamageSource();
if (optDmgSource.isPresent()) {
DamageSource dmgSource = optDmgSource.get();
Entity attacker = null;
if (dmgSource instanceof IndirectEntityDamageSource) {
attacker = ((IndirectEntityDamageSource) dmgSource).getIndirectSource();
} else if (dmgSource instanceof EntityDamageSource) {
attacker = ((EntityDamageSource) dmgSource).getSource();
if (attacker instanceof Player) {
/* TODO Convert to Sponge
if (ItemUtil.hasForgeBook((Player) attacker)) {
boss.setHealth(0);
final Player finalAttacker = (Player) attacker;
if (!finalAttacker.getGameMode().equals(GameMode.CREATIVE)) {
server().getScheduler().runTaskLater(inst(), () -> (finalAttacker).setItemInHand(null), 1);
}
}*/
}
}
if (Probability.getChance(3) && attacker instanceof Player) {
inst.spawnMinions((Player) attacker);
}
}
return Optional.empty();
});
}
use of com.flowpowered.math.vector.Vector3d in project Skree by Skelril.
the class PatientXInstance method freezeBlocks.
public void freezeBlocks(int percentage, boolean throwExplosives) {
ice.forAll((pt) -> {
BlockType aboveType = getRegion().getExtent().getBlockType(pt.add(0, 1, 0));
BlockType belowType = getRegion().getExtent().getBlockType(pt.add(0, -1, 0));
if (aboveType == BlockTypes.AIR && belowType == BlockTypes.WATER || belowType == BlockTypes.FLOWING_WATER) {
if (percentage >= 100) {
getRegion().getExtent().setBlockType(pt, BlockTypes.ICE, Cause.source(SkreePlugin.container()).build());
return;
}
BlockType curType = getRegion().getExtent().getBlockType(pt);
if (curType == BlockTypes.PACKED_ICE || curType == BlockTypes.ICE) {
getRegion().getExtent().setBlockType(pt, BlockTypes.WATER, Cause.source(SkreePlugin.container()).build());
if (!Probability.getChance(config.snowBallChance) || !throwExplosives)
return;
Location target = new Location<>(getRegion().getExtent(), pt.add(0, 1, 0));
for (int i = Probability.getRandom(3); i > 0; i--) {
Snowball melvin = (Snowball) getRegion().getExtent().createEntity(EntityTypes.SNOWBALL, target.getPosition());
melvin.setVelocity(new Vector3d(0, Probability.getRangedRandom(.25, 1), 0));
getRegion().getExtent().spawnEntity(melvin, Cause.source(SpawnCause.builder().type(SpawnTypes.PLUGIN).build()).build());
}
} else if (Probability.getChance(percentage, 100)) {
getRegion().getExtent().setBlockType(pt, BlockTypes.PACKED_ICE, Cause.source(SkreePlugin.container()).build());
}
}
});
}
use of com.flowpowered.math.vector.Vector3d in project Skree by Skelril.
the class PatientXInstance method runAttack.
public void runAttack(PatientXAttack attackCase) {
Optional<Zombie> optBoss = getBoss();
if (!optBoss.isPresent()) {
return;
}
Zombie boss = optBoss.get();
Collection<Player> contained = getPlayers(PARTICIPANT);
if (contained.isEmpty()) {
return;
}
switch(attackCase) {
case MUSICAL_CHAIRS:
sendAttackBroadcast("Let's play musical chairs!", AttackSeverity.NORMAL);
for (Player player : contained) {
do {
player.setLocation(getRandomDest());
} while (player.getLocation().getPosition().distanceSquared(boss.getLocation().getPosition()) <= 5 * 5);
// TODO convert to Sponge
if (((EntityZombie) boss).canEntityBeSeen(tf(player))) {
player.offer(Keys.HEALTH, Probability.getRandom(player.get(Keys.MAX_HEALTH).get()));
sendAttackBroadcast("Don't worry, I have a medical degree...", AttackSeverity.NORMAL);
sendAttackBroadcast("...or was that a certificate of insanity?", AttackSeverity.NORMAL);
}
}
attackDur = System.currentTimeMillis() + 2000;
break;
case SMASHING_HIT:
for (Player player : contained) {
final double old = player.get(Keys.HEALTH).get();
player.offer(Keys.HEALTH, 3D);
Task.builder().execute(() -> {
if (!player.isRemoved() || !contains(player))
return;
player.offer(Keys.HEALTH, old * .75);
}).delay(2, TimeUnit.SECONDS).submit(SkreePlugin.inst());
}
attackDur = System.currentTimeMillis() + 3000;
sendAttackBroadcast("This special attack will be a \"smashing hit\"!", AttackSeverity.NORMAL);
break;
case BOMB_PERFORMANCE:
double tntQuantity = Math.max(2, difficulty / 2.4);
for (Player player : contained) {
for (double i = Probability.getRangedRandom(tntQuantity, Math.pow(2, Math.min(9, tntQuantity))); i > 0; i--) {
PrimedTNT explosive = (PrimedTNT) getRegion().getExtent().createEntity(EntityTypes.PRIMED_TNT, player.getLocation().getPosition());
explosive.setVelocity(new Vector3d(random.nextDouble() * 1 - .5, random.nextDouble() * .8 + .2, random.nextDouble() * 1 - .5));
explosive.offer(Keys.FUSE_DURATION, 20 * 4);
getRegion().getExtent().spawnEntity(explosive, Cause.source(SpawnCause.builder().type(SpawnTypes.PLUGIN).build()).build());
}
}
attackDur = System.currentTimeMillis() + 5000;
sendAttackBroadcast("Your performance is really going to \"bomb\"!", AttackSeverity.NORMAL);
break;
case WITHER_AWAY:
PotionEffect witherEffect = PotionEffect.of(PotionEffectTypes.WITHER, 1, 20 * 15);
for (Player player : contained) {
List<PotionEffect> potionEffects = player.getOrElse(Keys.POTION_EFFECTS, new ArrayList<>(1));
potionEffects.add(witherEffect);
player.offer(Keys.POTION_EFFECTS, potionEffects);
}
attackDur = System.currentTimeMillis() + 15750;
sendAttackBroadcast("Like a candle I hope you don't \"whither\" and die!", AttackSeverity.NORMAL);
break;
case SPLASH_TO_IT:
for (Player player : contained) {
for (int i = Probability.getRandom(6) + 2; i > 0; --i) {
throwSlashPotion(player.getLocation());
}
}
attackDur = System.currentTimeMillis() + 2000;
sendAttackBroadcast("Splash to it!", AttackSeverity.NORMAL);
break;
case COLD_FEET:
PotionEffect slowEffect = PotionEffect.of(PotionEffectTypes.SLOWNESS, 2, 20 * 60);
for (Player player : contained) {
List<PotionEffect> potionEffects = player.getOrElse(Keys.POTION_EFFECTS, new ArrayList<>(1));
potionEffects.add(slowEffect);
player.offer(Keys.POTION_EFFECTS, potionEffects);
}
attackDur = System.currentTimeMillis() + 20000;
sendAttackBroadcast("What's the matter, got cold feet?", AttackSeverity.NORMAL);
break;
case IM_JUST_BATTY:
for (Player player : contained) {
Cause cause = Cause.source(SpawnCause.builder().type(SpawnTypes.PLUGIN).build()).build();
player.simulateChat(Text.of("I love Patient X!"), cause);
Entity bat = getRegion().getExtent().createEntity(EntityTypes.BAT, player.getLocation().getPosition());
getRegion().getExtent().spawnEntity(bat, cause);
bat.getPassengers().add(player);
}
attackDur = System.currentTimeMillis() + 20000;
sendAttackBroadcast("Awe, I love you too!", AttackSeverity.NORMAL);
sendAttackBroadcast("But only cause I'm a little batty...", AttackSeverity.NORMAL);
break;
case RADIATION:
ParticleEffect radiationEffect = ParticleEffect.builder().type(ParticleTypes.FLAME).quantity(1).build();
Task.builder().execute(() -> {
for (int i = config.radiationTimes; i > 0; i--) {
Task.builder().execute(() -> {
if (isBossSpawned()) {
for (Player player : getPlayers(PlayerClassifier.PARTICIPANT)) {
for (int e = 0; e < 30; ++e) {
getRegion().getExtent().spawnParticles(radiationEffect, player.getLocation().getPosition().add(5 - Probability.getRandom(10) + Probability.getRangedRandom(0, 1.0), 5 - Probability.getRandom(10) + Probability.getRangedRandom(0, 1.0), 5 - Probability.getRandom(10) + Probability.getRangedRandom(0, 1.0)));
}
if (LightLevelUtil.getMaxLightLevel(player.getLocation()).get() >= config.radiationLightLevel) {
player.damage(difficulty * config.radiationMultiplier, EntityDamageSource.builder().entity(boss).type(DamageTypes.MAGIC).build());
}
}
}
}).delay(i * 500, TimeUnit.MILLISECONDS).submit(SkreePlugin.inst());
}
}).delay(3, TimeUnit.SECONDS).submit(SkreePlugin.inst());
attackDur = System.currentTimeMillis() + (config.radiationTimes * 500);
sendAttackBroadcast("Ahhh not the radiation treatment!", AttackSeverity.NORMAL);
break;
case SNOWBALL_FIGHT:
final int burst = Probability.getRangedRandom(10, 20);
Task.builder().execute(() -> {
for (int i = burst; i > 0; i--) {
Task.builder().execute(() -> {
if (boss != null)
freezeBlocks(true);
}).delay(i * 500, TimeUnit.MILLISECONDS).submit(SkreePlugin.inst());
}
}).delay(7, TimeUnit.SECONDS).submit(SkreePlugin.inst());
attackDur = System.currentTimeMillis() + 7000 + (500 * burst);
sendAttackBroadcast("Let's have a snow ball fight!", AttackSeverity.NORMAL);
break;
}
lastAttack = attackCase;
}
use of com.flowpowered.math.vector.Vector3d in project Skree by Skelril.
the class PatientXInstance method throwSlashPotion.
private void throwSlashPotion(Location<World> location) {
PotionEffectType[] thrownTypes = new PotionEffectType[] { PotionEffectTypes.INSTANT_DAMAGE, PotionEffectTypes.INSTANT_DAMAGE, PotionEffectTypes.POISON, PotionEffectTypes.WEAKNESS };
Entity entity = location.getExtent().createEntity(EntityTypes.SPLASH_POTION, location.getPosition());
entity.setVelocity(new Vector3d(random.nextDouble() * .5 - .25, random.nextDouble() * .4 + .1, random.nextDouble() * .5 - .25));
PotionEffectType type = Probability.pickOneOf(thrownTypes);
PotionEffect effect = PotionEffect.of(type, 2, type.isInstant() ? 1 : 15 * 20);
entity.offer(Keys.POTION_EFFECTS, Lists.newArrayList(effect));
getRegion().getExtent().spawnEntity(entity, Cause.source(SpawnCause.builder().type(SpawnTypes.PLUGIN).build()).build());
}
Aggregations