use of org.spongepowered.api.event.cause.entity.damage.DamageFunction in project SpongeAPI by SpongePowered.
the class SpongeAbstractDamageEntityEventTest method testModifiersApplicable.
@Test
public void testModifiersApplicable() {
Entity targetEntity = mockParam(Entity.class);
DamageModifier firstModifer = mockParam(DamageModifier.class);
DamageModifier secondModifier = mockParam(DamageModifier.class);
List<DamageFunction> originalFunctions = Lists.newArrayList(DamageFunction.of(firstModifer, p -> p), DamageFunction.of(secondModifier, p -> p));
DamageEntityEvent event = SpongeEventFactory.createDamageEntityEvent(Cause.of(EventContext.empty(), "none"), originalFunctions, targetEntity, 0);
assertThat(event.isModifierApplicable(firstModifer), is(true));
assertThat(event.isModifierApplicable(secondModifier), is(true));
assertThat(event.isModifierApplicable(mockParam(DamageModifier.class)), is(false));
}
use of org.spongepowered.api.event.cause.entity.damage.DamageFunction in project Skree by Skelril.
the class PatientXListener method onEntityDamageEvent.
@Listener(order = Order.LAST)
public void onEntityDamageEvent(DamageEntityEvent event) {
Entity defender = event.getTargetEntity();
Optional<PatientXInstance> optInst = manager.getApplicableZone(defender);
if (!optInst.isPresent()) {
return;
}
PatientXInstance inst = optInst.get();
DamageSource dmgSource = event.getCause().first(DamageSource.class).get();
if (defender instanceof Player && manager.getBlockedDamage().contains(dmgSource.getType())) {
// Explosive damage formula: (1 × 1 + 1) × 8 × power + 1
// Use 49, snowball power is 3
double ratio = event.getBaseDamage() / 49;
// Nullify all modifiers
for (DamageFunction modifier : event.getModifiers()) {
event.setDamage(modifier.getModifier(), (a) -> 0D);
}
event.setBaseDamage(ratio * inst.getDifficulty());
}
}
use of org.spongepowered.api.event.cause.entity.damage.DamageFunction in project Skree by Skelril.
the class WildernessWorldWrapper method createFor.
private PlayerCombatParser createFor(Cancellable event, int level) {
return new PlayerCombatParser() {
@Override
public void processPvP(Player attacker, Player defender) {
if (allowsPvP(level)) {
return;
}
Optional<PvPService> optService = Sponge.getServiceManager().provide(PvPService.class);
if (optService.isPresent()) {
PvPService service = optService.get();
if (service.getPvPState(attacker).allowByDefault() && service.getPvPState(defender).allowByDefault()) {
return;
}
}
attacker.sendMessage(Text.of(TextColors.RED, "PvP is opt-in only in this part of the Wilderness!"));
attacker.sendMessage(Text.of(TextColors.RED, "Mandatory PvP is from level ", getFirstPvPLevel(), " and on."));
event.setCancelled(true);
}
@Override
public void processMonsterAttack(Living attacker, Player defender) {
if (!(event instanceof DamageEntityEvent)) {
return;
}
DamageEntityEvent dEvent = (DamageEntityEvent) event;
// If they're endermites they hit through armor, otherwise they get a damage boost
if (attacker.getType() == EntityTypes.ENDERMITE) {
for (DamageFunction modifier : dEvent.getModifiers()) {
dEvent.setDamage(modifier.getModifier(), (a) -> 0D);
}
dEvent.setBaseDamage(Probability.getCompoundRandom(getDamageMod(level), 3));
if (Probability.getChance(5)) {
List<PotionEffect> potionEffects = defender.getOrElse(Keys.POTION_EFFECTS, new ArrayList<>());
potionEffects.add(PotionEffect.of(PotionEffectTypes.POISON, 2, 30 * 20));
defender.offer(Keys.POTION_EFFECTS, potionEffects);
}
} else {
dEvent.setBaseDamage(dEvent.getBaseDamage() + getDamageMod(level));
}
// Only apply scoring while in survival mode
if (defender.get(Keys.GAME_MODE).orElse(GameModes.SURVIVAL) != GameModes.SURVIVAL) {
return;
}
WildernessPlayerMeta meta = playerMetaMap.get(defender.getUniqueId());
if (meta != null) {
meta.hit();
}
}
@Override
public void processPlayerAttack(Player attacker, Living defender) {
Task.builder().delayTicks(1).execute(() -> healthPrinter.print(MessageChannel.fixed(attacker), defender)).submit(SkreePlugin.inst());
if (!(defender instanceof Monster) || defender instanceof Creeper) {
return;
}
// Only apply scoring while in survival mode
if (attacker.get(Keys.GAME_MODE).orElse(GameModes.SURVIVAL) != GameModes.SURVIVAL) {
return;
}
WildernessPlayerMeta meta = playerMetaMap.get(attacker.getUniqueId());
if (meta != null) {
meta.attack();
if (meta.getRatio() > 30 && meta.getFactors() > 35) {
Deque<Entity> spawned = new ArrayDeque<>();
for (int i = Probability.getRandom(5); i > 0; --i) {
Entity entity = attacker.getWorld().createEntity(EntityTypes.ENDERMITE, defender.getLocation().getPosition());
entity.getWorld().spawnEntity(entity, Cause.source(SpawnCause.builder().type(SpawnTypes.PLUGIN).build()).build());
spawned.add(entity);
}
IntegratedRunnable runnable = new IntegratedRunnable() {
@Override
public boolean run(int times) {
Entity mob = spawned.poll();
if (mob.isLoaded() && mob.getWorld().equals(attacker.getWorld())) {
mob.setLocation(attacker.getLocation());
}
return true;
}
@Override
public void end() {
}
};
TimedRunnable timedRunnable = new TimedRunnable<>(runnable, spawned.size());
timedRunnable.setTask(Task.builder().execute(timedRunnable).delayTicks(40).intervalTicks(20).submit(SkreePlugin.inst()));
}
if (System.currentTimeMillis() - meta.getLastReset() >= TimeUnit.MINUTES.toMillis(5)) {
meta.reset();
}
}
}
};
}
use of org.spongepowered.api.event.cause.entity.damage.DamageFunction in project Skree by Skelril.
the class TheForgeListener method createCombatParser.
private PlayerCombatParser createCombatParser(Event event, TheForgeInstance inst) {
return new PlayerCombatParser() {
@Override
public void processPlayerAttack(Player attacker, Living defender) {
if (!(event instanceof DamageEntityEvent)) {
return;
}
if (attacker.getLocation().getY() != attacker.getLocation().getBlockY()) {
DamageEntityEvent dEvent = (DamageEntityEvent) event;
dEvent.setBaseDamage(Probability.getCompoundRandom(dEvent.getBaseDamage(), 4));
}
}
@Override
public void processMonsterAttack(Living attacker, Player defender) {
if (!(event instanceof DamageEntityEvent)) {
return;
}
if (inst.isInvunerable(defender)) {
((DamageEntityEvent) event).setCancelled(true);
return;
}
if (Probability.getChance(5)) {
DamageEntityEvent dEvent = (DamageEntityEvent) event;
for (DamageFunction modifier : dEvent.getModifiers()) {
dEvent.setDamage(modifier.getModifier(), (a) -> 0D);
}
}
}
};
}
use of org.spongepowered.api.event.cause.entity.damage.DamageFunction in project LanternServer by LanternPowered.
the class LanternEntity method collectDamageFunctions.
protected void collectDamageFunctions(List<Tuple<DamageFunction, Consumer<DamageEntityEvent>>> damageFunctions) {
// Absorption health modifier
get(Keys.ABSORPTION).filter(value -> value > 0).ifPresent(value -> {
final DoubleUnaryOperator function = d -> -(Math.max(d - Math.max(d - value, 0), 0));
final DamageModifier modifier = DamageModifier.builder().cause(Cause.of(EventContext.empty(), this)).type(DamageModifierTypes.ABSORPTION).build();
damageFunctions.add(new Tuple<>(new DamageFunction(modifier, function), event -> {
final double mod = event.getDamage(modifier);
offer(Keys.ABSORPTION, Math.max(get(Keys.ABSORPTION).get() + mod, 0));
}));
});
}
Aggregations