Files
2009scape/Server/src/main/content/region/fremennik/waterbirth/handlers/SpinolypNPC.java
T
2026-04-19 19:59:49 +10:00

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);
}
}
}