2020-04-15 14:22:03 +02:00
|
|
|
package com.minelittlepony.unicopia.ability;
|
2020-01-16 12:35:46 +01:00
|
|
|
|
|
|
|
import java.util.List;
|
2023-08-16 00:18:41 +02:00
|
|
|
import java.util.Optional;
|
2024-03-28 22:30:28 +01:00
|
|
|
import java.util.function.Predicate;
|
|
|
|
import java.util.stream.Stream;
|
2020-01-16 12:35:46 +01:00
|
|
|
|
2021-08-04 15:38:03 +02:00
|
|
|
import org.jetbrains.annotations.Nullable;
|
2020-01-16 12:35:46 +01:00
|
|
|
|
2023-08-22 17:25:36 +02:00
|
|
|
import com.minelittlepony.unicopia.USounds;
|
2020-04-25 15:37:17 +02:00
|
|
|
import com.minelittlepony.unicopia.ability.data.Hit;
|
2024-03-28 22:30:28 +01:00
|
|
|
import com.minelittlepony.unicopia.ability.magic.spell.ChangelingFeedingSpell;
|
|
|
|
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
|
2020-09-22 15:11:20 +02:00
|
|
|
import com.minelittlepony.unicopia.entity.player.Pony;
|
2022-10-01 18:20:53 +02:00
|
|
|
import com.minelittlepony.unicopia.util.TraceHelper;
|
2020-04-15 14:22:03 +02:00
|
|
|
import com.minelittlepony.unicopia.util.VecHelper;
|
2020-01-16 12:35:46 +01:00
|
|
|
|
|
|
|
import net.minecraft.entity.Entity;
|
|
|
|
import net.minecraft.entity.LivingEntity;
|
|
|
|
import net.minecraft.entity.mob.HostileEntity;
|
|
|
|
import net.minecraft.entity.passive.CowEntity;
|
2020-12-17 19:17:47 +01:00
|
|
|
import net.minecraft.entity.passive.MerchantEntity;
|
2020-01-16 12:35:46 +01:00
|
|
|
import net.minecraft.entity.passive.PigEntity;
|
|
|
|
import net.minecraft.entity.passive.SheepEntity;
|
|
|
|
import net.minecraft.entity.player.PlayerEntity;
|
|
|
|
import net.minecraft.particle.ParticleTypes;
|
|
|
|
|
2020-01-27 17:37:22 +01:00
|
|
|
/**
|
|
|
|
* Changeling ability to restore health from mobs
|
|
|
|
*/
|
2020-04-25 15:37:17 +02:00
|
|
|
public class ChangelingFeedAbility implements Ability<Hit> {
|
2024-03-28 22:30:28 +01:00
|
|
|
private static final Predicate<Entity> TARGET_PREDICATE = e -> (e instanceof LivingEntity)
|
|
|
|
&& (e instanceof CowEntity
|
|
|
|
|| e instanceof MerchantEntity
|
|
|
|
|| e instanceof PlayerEntity
|
|
|
|
|| e instanceof SheepEntity
|
|
|
|
|| e instanceof PigEntity
|
|
|
|
|| e instanceof HostileEntity);
|
2020-01-16 12:35:46 +01:00
|
|
|
|
|
|
|
@Override
|
2020-04-15 18:12:00 +02:00
|
|
|
public int getWarmupTime(Pony player) {
|
2020-01-16 12:35:46 +01:00
|
|
|
return 5;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-04-15 18:12:00 +02:00
|
|
|
public int getCooldownTime(Pony player) {
|
2024-03-28 22:30:28 +01:00
|
|
|
return !SpellType.FEED.isOn(player) && ChangelingFeedingSpell.canFeed(player) ? 15 : 80;
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
@Override
|
2023-08-16 00:18:41 +02:00
|
|
|
public Optional<Hit> prepare(Pony player) {
|
2024-03-28 22:30:28 +01:00
|
|
|
return Hit.of(ChangelingFeedingSpell.canFeed(player) && !getTargets(player).findAny().isEmpty());
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2020-04-25 15:37:17 +02:00
|
|
|
public Hit.Serializer<Hit> getSerializer() {
|
|
|
|
return Hit.SERIALIZER;
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
|
2020-10-09 19:05:12 +02:00
|
|
|
@Override
|
|
|
|
public double getCostEstimate(Pony player) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-01-16 12:35:46 +01:00
|
|
|
@Override
|
2023-08-16 00:18:41 +02:00
|
|
|
public boolean apply(Pony iplayer, Hit data) {
|
2024-03-28 22:30:28 +01:00
|
|
|
if (!ChangelingFeedingSpell.canFeed(iplayer)) {
|
2023-08-16 00:18:41 +02:00
|
|
|
return false;
|
2022-12-24 21:13:20 +01:00
|
|
|
}
|
|
|
|
|
2022-12-19 16:03:35 +01:00
|
|
|
PlayerEntity player = iplayer.asEntity();
|
2020-01-16 12:35:46 +01:00
|
|
|
|
2020-06-26 11:44:47 +02:00
|
|
|
float maximumHealthGain = player.getMaxHealth() - player.getHealth();
|
2020-01-16 12:35:46 +01:00
|
|
|
int maximumFoodGain = player.canConsume(false) ? (20 - player.getHungerManager().getFoodLevel()) : 0;
|
|
|
|
|
|
|
|
if (maximumHealthGain > 0 || maximumFoodGain > 0) {
|
2024-03-28 22:30:28 +01:00
|
|
|
List<LivingEntity> targets = getTargets(iplayer).map(LivingEntity.class::cast).toList();
|
2020-01-16 12:35:46 +01:00
|
|
|
|
2024-03-28 22:30:28 +01:00
|
|
|
if (targets.size() > 0) {
|
|
|
|
new ChangelingFeedingSpell(targets, maximumHealthGain, maximumFoodGain).apply(iplayer);
|
2020-01-16 12:35:46 +01:00
|
|
|
|
2024-03-28 22:30:28 +01:00
|
|
|
iplayer.playSound(USounds.ENTITY_PLAYER_CHANGELING_FEED, 0.1F, iplayer.getRandomPitch());
|
|
|
|
return true;
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
}
|
2023-08-16 00:18:41 +02:00
|
|
|
|
2024-03-28 22:30:28 +01:00
|
|
|
iplayer.playSound(USounds.Vanilla.ENTITY_PLAYER_BURP, 1, (float)player.getWorld().random.nextTriangular(1F, 0.2F));
|
2023-08-16 00:18:41 +02:00
|
|
|
return true;
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
|
2024-03-28 22:30:28 +01:00
|
|
|
protected Stream<Entity> getTargets(Pony player) {
|
|
|
|
return Stream.concat(
|
|
|
|
VecHelper.findInRange(player.asEntity(), player.asWorld(), player.getOriginVector(), 3, TARGET_PREDICATE).stream(),
|
|
|
|
TraceHelper.findEntity(player.asEntity(), 17, 1, TARGET_PREDICATE).stream()
|
|
|
|
).distinct();
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2023-08-16 00:18:41 +02:00
|
|
|
public void warmUp(Pony player, AbilitySlot slot) {
|
2023-08-16 12:57:34 +02:00
|
|
|
player.getMagicalReserves().getExertion().addPercent(6);
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2023-08-16 00:18:41 +02:00
|
|
|
public void coolDown(Pony player, AbilitySlot slot) {
|
2022-12-19 18:13:15 +01:00
|
|
|
if (player.asWorld().random.nextInt(10) == 0) {
|
2021-01-27 16:16:31 +01:00
|
|
|
player.spawnParticles(ParticleTypes.HEART, 1);
|
|
|
|
}
|
2020-01-16 12:35:46 +01:00
|
|
|
}
|
|
|
|
}
|