1package com.runehive.game.world.entity.combat;
3import com.runehive.content.bot.PlayerBot;
4import com.runehive.game.task.Task;
5import com.runehive.game.world.World;
6import com.runehive.game.world.entity.combat.attack.FightStyle;
7import com.runehive.game.world.entity.combat.attack.FightType;
8import com.runehive.game.world.entity.combat.attack.listener.CombatListener;
9import com.runehive.game.world.entity.combat.formula.CombatFormula;
10import com.runehive.game.world.entity.combat.hit.CombatData;
11import com.runehive.game.world.entity.combat.hit.CombatHit;
12import com.runehive.game.world.entity.combat.hit.Hit;
13import com.runehive.game.world.entity.combat.strategy.CombatStrategy;
14import com.runehive.game.world.entity.mob.Mob;
15import com.runehive.game.world.entity.mob.player.Player;
16import com.runehive.game.world.position.Position;
17import com.runehive.game.world.region.Region;
18import com.runehive.net.packet.out.SendEntityFeed;
19import com.runehive.util.Stopwatch;
20import com.runehive.util.Utility;
22import java.util.ArrayDeque;
23import java.util.Deque;
24import java.util.Iterator;
25import java.util.concurrent.TimeUnit;
42 private final Deque<CombatListener<? super T>>
listeners =
new ArrayDeque<>();
43 private final Deque<CombatListener<? super T>>
pendingAddition =
new ArrayDeque<>();
44 private final Deque<CombatListener<? super T>>
pendingRemoval =
new ArrayDeque<>();
47 private final Deque<CombatData<T>>
combatQueue =
new ArrayDeque<>();
74 target.setTarget(defender);
91 if (
target.getTarget() !=
null) {
115 final Mob targetMob =
target.getTarget();
131 if (
attacker.getCurrentHealth() <= 0) {
162 if (defender ==
null)
return;
165 listener.performChecks(
attacker, defender);
205 for (
int index = 0; index < hits.length; index++) {
206 boolean last = index == hits.length - 1;
215 if (
attacker.getCurrentHealth() <= 0) {
251 if (!listener.canAttack(
attacker, defender)) {
269 if (!listener.canAttack(
attacker, defender)) {
277 T defender = this.attacker;
279 if (!listener.canOtherAttack(
attacker, defender)) {
293 combatQueue.removeIf(_hit -> _hit.getDefender() == defender);
295 defender.
getCombat().damageQueue.clear();
300 defender.
getCombat().lastBlocked.reset();
303 Hit[] finalHits = hits;
309 combatQueue.removeIf(_hit -> _hit.getDefender() == defender);
311 defender.
getCombat().damageQueue.clear();
325 T defender = this.attacker;
328 defender.action.reset();
331 defender.getCombat().retaliate(
attacker);
336 combatQueue.removeIf(_hit -> _hit.getDefender() == defender);
338 defender.
getCombat().damageQueue.clear();
357 combatQueue.removeIf(_hit -> _hit.getDefender() == defender);
359 defender.
getCombat().damageQueue.clear();
376 T defender = this.attacker;
385 if (defender.isPlayer() && defender.getPlayer().isBot) {
386 ((
PlayerBot) defender.getPlayer()).retaliate(player);
390 if (defender.isPlayer()) {
410 if (defender.isAutoRetaliate() && (defender.isNpc() || defender.movement.isMovementDone())) {
417 T defender = this.attacker;
438 if (
attacker.isPlayer() &&
attacker.getPlayer().getCombatSpecial() !=
null) {
439 attacker.getPlayer().getCombatSpecial().getStrategy().onKill(
attacker.getPlayer(), defender,
hit);
447 T defender = this.attacker;
449 defender.movement.reset();
450 defender.resetWaypoint();
462 T defender = this.attacker;
468 if (force ||
target.getTarget() !=
null) {
561 this.fightType = type;
566 this.combatType = type;
574 return target.getTarget();
586 target.checkAggression(spawn);
604 public void execute() {
615 public void execute() {
625 return timer.
elapsed(delay, TimeUnit.MILLISECONDS);
635 return Math.max(attacked, blocked);
651 if (!listener.withinDistance(
attacker, defender))
A game representing a cyclic unit of work.
Represents the game world.
static void schedule(Task task)
Submits a new event.
abstract boolean equals(Object obj)
static final int COMBAT_TIMER_COOLDOWN
The amount of time it takes in seconds for combat to reset.
A fs of players who have inflicted damage on another player in a combat session.
boolean canAttack(Mob defender, CombatStrategy<? super T > strategy)
boolean hasPassed(int delay)
void onDeath(Mob attacker, Hit hit)
boolean inCombatWith(Mob mob)
int modifyRangedLevel(Mob defender, int level)
boolean canAttack(Mob defender)
void start(Mob defender, CombatStrategy<? super T > strategy, Hit... hits)
int modifyStrengthLevel(Mob defender, int level)
void preKill(Mob defender, Hit hit)
int modifyAggresiveBonus(Mob defender, int bonus)
int modifyDamage(Mob defender, int damage)
boolean hasPassed(Stopwatch timer, int delay)
void removeModifier(FormulaModifier<? super T > modifier)
boolean checkWithin(T attacker, Mob defender, CombatStrategy<? super T > strategy)
void submitHits(Mob defender, CombatStrategy<? super T > strategy, CombatHit... hits)
int modifyDefenceLevel(Mob attacker, int level)
int modifyAttackLevel(Mob defender, int level)
void hitsplat(Mob defender, Hit hit, CombatStrategy<? super T > strategy)
void compare(Mob mob, int level, Position spawn)
final CombatFormula< T > formula
void addFirst(FormulaModifier<? super T > modifier)
int modifyMagicLevel(Mob defender, int level)
void removeListener(CombatListener<? super T > listener)
void queueDamage(Hit hit)
boolean checkDistances(Mob defender)
final Stopwatch lastBlocked
void finishOutgoing(Mob defender, CombatStrategy<? super T > strategy)
void preDeath(Mob attacker, Hit hit)
void onKill(Mob defender, Hit hit)
int modifyOffensiveBonus(Mob defender, int bonus)
void init(Mob defender, CombatStrategy<? super T > strategy)
final CombatDamage damageCache
void performChecks(final Mob defender)
FightStyle getFightStyle()
Task hitTask(CombatData< T > data)
boolean sendNextHitsplat()
final Deque< CombatData< T > > combatQueue
final int[] hitsplatCooldowns
void submitHits(Mob defender, CombatHit... hits)
void checkAggression(Position spawn)
void addListener(CombatListener<? super T > listener)
void hit(Mob defender, Hit hit, CombatStrategy<? super T > strategy)
boolean isAttacking(Mob defender)
int modifyDefensiveBonus(Mob attacker, int bonus)
void block(Mob attacker, Hit hit, CombatType combatType)
CombatType getCombatType()
void setFightType(FightType type)
final Deque< CombatListener<? super T > > pendingRemoval
boolean canOtherAttack(Mob attacker)
int modifyDefensive(Mob attacker, int roll)
void attack(Mob defender, Hit hit, CombatStrategy<? super T > strategy)
CombatDamage getDamageCache()
Task hitsplatTask(CombatData< T > data)
boolean attack(Mob defender)
void submitStrategy(Mob defender, CombatStrategy<? super T > strategy)
boolean isUnderAttackByPlayer()
void reset(boolean force)
final Deque< CombatListener<? super T > > pendingAddition
void resetTimers(int millis)
void setCombatType(CombatType type)
void setCooldown(int delay)
boolean isUnderAttackByNpc()
boolean isLastAggressor(Mob mob)
boolean isUnderAttackBy(Mob attacker)
int modifyAccuracy(Mob defender, int roll)
void addModifier(FormulaModifier<? super T > modifier)
final Stopwatch lastAttacked
final Deque< Hit > damageQueue
final Deque< CombatListener<? super T > > listeners
void finishIncoming(Mob attacker)
void retaliate(Mob attacker)
A collection of util methods and constants related to combat.
static boolean validateMobs(Mob attacker, Mob defender)
static boolean validate(Mob attacker, Mob defender)
static Animation getBlockAnimation(Mob mob)
static boolean canBasicAttack(Mob attacker, Mob defender)
static boolean canAttack(Mob attacker, Mob defender)
Holds variables to generate combat data of an actor.
CombatStrategy<? super T > getStrategy()
A wrapper for a Hit object, adding additional variables for hit and hitsplat delays.
A Hit object holds the damage amount and hitsplat data.
abstract< T extends Mob > CombatStrategy<? super T > getStrategy()
The combat strategy of the mob.
abstract Combat<? extends Mob > getCombat()
The combat of the mob.
void animate(int animation)
final boolean isPlayer()
Check if an entity is a player.
boolean isDialogueClear()
Checks if the dialogue interface is clear.
void close(int interfaceId)
boolean isMainClear()
Checks if the main interface is clear.
This class represents a character controlled by a player.
final InterfaceManager interfaceManager
Represents a single tile on the game world.
Represents a single region.
static final int VIEW_DISTANCE
boolean elapsed(long time, TimeUnit unit)
Handles miscellaneous methods.
static boolean inside(Interactable source, Interactable target)
static boolean withinDistance(Interactable source, Interactable target, int radius)
The enumerated type whose elements represent the fighting styles.
The enumerated type whose elements represent the fighting types.
final FightStyle getStyle()
Gets the style active when this type is active.
A combat attack is used to describe what the attacking and defending mobs should do in each stage of ...