167 lines
4.5 KiB
Java
167 lines
4.5 KiB
Java
package content.region.fremennik.waterbirth.handlers;
|
|
|
|
import core.game.node.entity.Entity;
|
|
import core.game.node.entity.combat.BattleState;
|
|
import core.game.node.entity.combat.spell.CombatSpell;
|
|
import core.game.node.entity.combat.CombatStyle;
|
|
import core.game.node.entity.combat.InteractionType;
|
|
import core.game.node.entity.combat.equipment.SwitchAttack;
|
|
import core.game.node.entity.npc.AbstractNPC;
|
|
import core.game.node.entity.player.link.SpellBookManager.SpellBook;
|
|
import core.game.world.map.Location;
|
|
import core.tools.RandomFunction;
|
|
import core.game.node.entity.combat.CombatSwingHandler;
|
|
import core.game.node.entity.combat.MultiSwingHandler;
|
|
|
|
import static core.api.ContentAPIKt.*;
|
|
|
|
/**
|
|
* Represents a spinolyp npc.
|
|
* @author Vexia
|
|
*/
|
|
public final class SpinolypNPC extends AbstractNPC {
|
|
|
|
/**
|
|
* The swing handler.
|
|
*/
|
|
private static final CombatSwingHandler SWING_HANDLER = new SpinolpySwingHandler();
|
|
|
|
/**
|
|
* Constructs a new {@Code SpinolypNPC} {@Code Object}
|
|
*/
|
|
public SpinolypNPC() {
|
|
this(-1, null);
|
|
}
|
|
|
|
/**
|
|
* Constructs a new {@Code SpinolypNPC} {@Code Object}
|
|
* @param id the id.
|
|
* @param location the location.
|
|
*/
|
|
public SpinolypNPC(int id, Location location) {
|
|
super(id, location);
|
|
super.setAggressive(true);
|
|
super.setNeverWalks(true);
|
|
}
|
|
|
|
@Override
|
|
public AbstractNPC construct(int id, Location location, Object... objects) {
|
|
return new SpinolypNPC(id, location);
|
|
}
|
|
|
|
@Override
|
|
public CombatSwingHandler getSwingHandler(boolean swing) {
|
|
return SWING_HANDLER;
|
|
}
|
|
|
|
@Override
|
|
public void init() {
|
|
super.init();
|
|
super.getLocks().lockMovement(Integer.MAX_VALUE);
|
|
setSpell();
|
|
getAggressiveHandler().setAllowTolerance(false);
|
|
}
|
|
|
|
/**
|
|
* Sets the spell.
|
|
*/
|
|
public void setSpell() {
|
|
CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(14);
|
|
getProperties().setSpell(spell);
|
|
getProperties().setAutocastSpell(spell);
|
|
}
|
|
|
|
@Override
|
|
public void sendImpact(BattleState state) {
|
|
if (state.getEstimatedHit() == 0 && RandomFunction.random(15) < 2) {
|
|
state.setEstimatedHit(RandomFunction.random(1, 11));
|
|
}
|
|
if (state.getEstimatedHit() > 11) {
|
|
state.setEstimatedHit(RandomFunction.random(3, 9));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int[] getIds() {
|
|
return new int[] { 2894, 2896 };
|
|
}
|
|
|
|
/**
|
|
* Handles the spinolpys swings.
|
|
* @author Vexia
|
|
*/
|
|
public static final class SpinolpySwingHandler extends MultiSwingHandler {
|
|
|
|
/**
|
|
* Constructs a new {@Code SpinolpySwingHandler} {@Code
|
|
* Object}
|
|
*/
|
|
public SpinolpySwingHandler() {
|
|
super(new SwitchAttack(CombatStyle.MAGIC.getSwingHandler(), null), new SwitchAttack(CombatStyle.RANGE.getSwingHandler(), null));
|
|
}
|
|
|
|
@Override
|
|
public InteractionType canSwing(Entity entity, Entity victim) {
|
|
InteractionType type = super.canSwing(entity, victim);
|
|
if (type == InteractionType.MOVE_INTERACT) {
|
|
type = InteractionType.NO_INTERACT;
|
|
}
|
|
return type;
|
|
}
|
|
|
|
@Override
|
|
public int swing(Entity entity, Entity victim, BattleState state) {
|
|
int swing = super.swing(entity, victim, state);
|
|
if (getType() == CombatStyle.MAGIC) {
|
|
setSpell(entity);
|
|
}
|
|
return swing;
|
|
}
|
|
|
|
@Override
|
|
public int getCombatDistance(Entity e, Entity v, int distance) {
|
|
return 12;
|
|
}
|
|
|
|
@Override
|
|
public int calculateDefence(Entity v, Entity e) {
|
|
// Spinolyps' attack always targets ranged defence
|
|
return CombatStyle.RANGE.getSwingHandler().calculateDefence(v, e);
|
|
}
|
|
|
|
@Override
|
|
public void visualize(Entity entity, Entity victim, BattleState state) {
|
|
super.visualize(entity, victim, state);
|
|
if (state.getStyle() == CombatStyle.MAGIC) {
|
|
setSpell(entity);
|
|
CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(14);
|
|
state.setSpell(spell);
|
|
}
|
|
state.getStyle().getSwingHandler().visualize(entity, victim, state);
|
|
entity.getAnimator().forceAnimation(entity.getProperties().getAttackAnimation());
|
|
}
|
|
|
|
@Override
|
|
public void impact(Entity entity, Entity victim, BattleState state) {
|
|
super.impact(entity, victim, state);
|
|
if (super.getType() == CombatStyle.MAGIC && state.getEstimatedHit() > 0) {
|
|
victim.getSkills().decrementPrayerPoints(1);
|
|
} else if (super.getType() == CombatStyle.RANGE && state.getEstimatedHit() > 0) {
|
|
if (RandomFunction.random(20) == 5) {
|
|
applyPoison(victim, entity, 30);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets the spell.
|
|
*/
|
|
public void setSpell(Entity e) {
|
|
CombatSpell spell = (CombatSpell) SpellBook.MODERN.getSpell(14);
|
|
e.getProperties().setSpell(spell);
|
|
e.getProperties().setAutocastSpell(spell);
|
|
}
|
|
}
|
|
|
|
}
|