Implemented special attacks for Morrigan's throwing axes and javelins
This commit is contained in:
+70
@@ -0,0 +1,70 @@
|
|||||||
|
package content.global.handlers.item.equipment.special;
|
||||||
|
|
||||||
|
import core.api.ContentAPIKt;
|
||||||
|
import core.game.node.entity.Entity;
|
||||||
|
import core.game.node.entity.combat.BattleState;
|
||||||
|
import core.game.node.entity.combat.CombatStyle;
|
||||||
|
import core.game.node.entity.combat.ImpactHandler;
|
||||||
|
import core.game.node.entity.combat.RangeSwingHandler;
|
||||||
|
import core.game.node.entity.player.Player;
|
||||||
|
import core.game.system.timer.RSTimer;
|
||||||
|
import core.game.system.timer.TimerFlag;
|
||||||
|
import core.plugin.Initializable;
|
||||||
|
import core.plugin.Plugin;
|
||||||
|
import core.tools.RandomFunction;
|
||||||
|
import org.rs09.consts.Items;
|
||||||
|
|
||||||
|
@Initializable
|
||||||
|
public final class HamstringSpecialHandler extends RangeSwingHandler implements Plugin<Object> {
|
||||||
|
private static final int SPECIAL_ENERGY = 50;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object fireEvent(String identifier, Object... args) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin<Object> newInstance(Object arg) throws Throwable {
|
||||||
|
CombatStyle.RANGE.getSwingHandler().register(Items.MORRIGANS_THROWING_AXE_13883, this);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int swing(Entity entity, Entity victim, BattleState state) {
|
||||||
|
Player p = (Player) entity;
|
||||||
|
configureRangeData(p, state);
|
||||||
|
if (state.getWeapon() == null || !Companion.hasAmmo(entity, state)) {
|
||||||
|
entity.getProperties().getCombatPulse().stop();
|
||||||
|
p.getSettings().toggleSpecialBar();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
state.setStyle(CombatStyle.RANGE);
|
||||||
|
int max = calculateHit(entity, victim, 1.2);
|
||||||
|
state.setMaximumHit(max);
|
||||||
|
int hit = 0;
|
||||||
|
if (isAccurateImpact(entity, victim)) {
|
||||||
|
hit = RandomFunction.random(max);
|
||||||
|
}
|
||||||
|
state.setEstimatedHit(hit);
|
||||||
|
Companion.useAmmo(entity, state, victim.getLocation());
|
||||||
|
ContentAPIKt.registerTimer(victim, new RSTimer(100, "hamstrung", true, false, new TimerFlag[] { TimerFlag.ClearOnDeath } ) {
|
||||||
|
@Override
|
||||||
|
public void onRegister(Entity entity) {
|
||||||
|
if(entity instanceof Player) {
|
||||||
|
((Player)entity).sendMessage("You've been hamstrung! For the next minute, your run energy will drain 4x faster.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(Entity entity) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return 1 + (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
+82
@@ -0,0 +1,82 @@
|
|||||||
|
package content.global.handlers.item.equipment.special;
|
||||||
|
|
||||||
|
import core.api.ContentAPIKt;
|
||||||
|
import core.game.node.entity.Entity;
|
||||||
|
import core.game.node.entity.combat.BattleState;
|
||||||
|
import core.game.node.entity.combat.CombatStyle;
|
||||||
|
import core.game.node.entity.combat.ImpactHandler;
|
||||||
|
import core.game.node.entity.combat.RangeSwingHandler;
|
||||||
|
import core.game.node.entity.player.Player;
|
||||||
|
import core.game.system.timer.RSTimer;
|
||||||
|
import core.game.system.timer.TimerFlag;
|
||||||
|
import core.plugin.Initializable;
|
||||||
|
import core.plugin.Plugin;
|
||||||
|
import core.tools.RandomFunction;
|
||||||
|
import org.rs09.consts.Items;
|
||||||
|
|
||||||
|
@Initializable
|
||||||
|
public final class PhantomStrikeSpecialHandler extends RangeSwingHandler implements Plugin<Object> {
|
||||||
|
private static final int SPECIAL_ENERGY = 50;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object fireEvent(String identifier, Object... args) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Plugin<Object> newInstance(Object arg) throws Throwable {
|
||||||
|
CombatStyle.RANGE.getSwingHandler().register(Items.MORRIGANS_JAVELIN_13879, this);
|
||||||
|
CombatStyle.RANGE.getSwingHandler().register(Items.MORRIGANS_JAVELINP_13880, this);
|
||||||
|
CombatStyle.RANGE.getSwingHandler().register(Items.MORRIGANS_JAVELINP_PLUS_13881, this);
|
||||||
|
CombatStyle.RANGE.getSwingHandler().register(Items.MORRIGANS_JAVELINP_PLUS_PLUS_13882, this);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int swing(Entity entity, Entity victim, BattleState state) {
|
||||||
|
Player p = (Player) entity;
|
||||||
|
configureRangeData(p, state);
|
||||||
|
if (state.getWeapon() == null || !Companion.hasAmmo(entity, state)) {
|
||||||
|
entity.getProperties().getCombatPulse().stop();
|
||||||
|
p.getSettings().toggleSpecialBar();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!((Player) entity).getSettings().drainSpecial(SPECIAL_ENERGY)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
state.setStyle(CombatStyle.RANGE);
|
||||||
|
int max = calculateHit(entity, victim, 1.0);
|
||||||
|
state.setMaximumHit(max);
|
||||||
|
int hit = 0;
|
||||||
|
if (isAccurateImpact(entity, victim)) {
|
||||||
|
hit = RandomFunction.random(max);
|
||||||
|
}
|
||||||
|
state.setEstimatedHit(hit);
|
||||||
|
Companion.useAmmo(entity, state, victim.getLocation());
|
||||||
|
final Entity attacker = entity;
|
||||||
|
final int initialDamage = hit;
|
||||||
|
ContentAPIKt.registerTimer(victim, new RSTimer(3, "phantom-strike", true, false, new TimerFlag[] { TimerFlag.ClearOnDeath } ) {
|
||||||
|
int remainingDamage = initialDamage;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRegister(Entity entity) {
|
||||||
|
if(entity instanceof Player) {
|
||||||
|
((Player)entity).sendMessage("You start to bleed as the result of the javelin strike.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(Entity entity) {
|
||||||
|
if(entity instanceof Player) {
|
||||||
|
((Player)entity).sendMessage("You continue to bleed as the result of the javelin strike.");
|
||||||
|
}
|
||||||
|
int tickDamage = Math.min(remainingDamage, 5);
|
||||||
|
remainingDamage -= tickDamage;
|
||||||
|
entity.getImpactHandler().manualHit(attacker, tickDamage, ImpactHandler.HitsplatType.NORMAL);
|
||||||
|
return remainingDamage > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return 1 + (int) Math.ceil(entity.getLocation().getDistance(victim.getLocation()) * 0.3);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -190,6 +190,9 @@ public final class WalkingQueue {
|
|||||||
if (player.getSettings().getWeight() > 0.0) {
|
if (player.getSettings().getWeight() > 0.0) {
|
||||||
rate *= 1 + (player.getSettings().getWeight() / 100);
|
rate *= 1 + (player.getSettings().getWeight() / 100);
|
||||||
}
|
}
|
||||||
|
if (hasTimerActive(player, "hamstrung")) {
|
||||||
|
rate *= 4;
|
||||||
|
}
|
||||||
return rate;
|
return rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user