RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
KingBlackDragonStrategy.java
1package com.osroyale.game.world.entity.combat.strategy.npc.boss;
2
3import com.osroyale.game.Animation;
4import com.osroyale.game.UpdatePriority;
5import com.osroyale.game.world.entity.combat.CombatType;
6import com.osroyale.game.world.entity.combat.CombatUtil;
7import com.osroyale.game.world.entity.combat.attack.FightType;
8import com.osroyale.game.world.entity.combat.hit.CombatHit;
9import com.osroyale.game.world.entity.combat.hit.Hit;
10import com.osroyale.game.world.entity.combat.strategy.CombatStrategy;
11import com.osroyale.game.world.entity.combat.strategy.npc.MultiStrategy;
12import com.osroyale.game.world.entity.combat.strategy.npc.NpcMeleeStrategy;
13import com.osroyale.game.world.entity.combat.strategy.npc.impl.DragonfireStrategy;
14import com.osroyale.game.world.entity.mob.Mob;
15import com.osroyale.game.world.entity.mob.npc.Npc;
16
17import static com.osroyale.game.world.entity.combat.CombatUtil.createStrategyArray;
18import static com.osroyale.game.world.entity.combat.CombatUtil.randomStrategy;
19import static com.osroyale.game.world.entity.combat.projectile.CombatProjectile.getDefinition;
20
52
53public class KingBlackDragonStrategy extends MultiStrategy {
54 private static final StabMelee STAB = new StabMelee();
55 private static final CrushMelee CRUSH = new CrushMelee();
56 private static final Dragonfire DRAGONFIRE = new Dragonfire();
57 private static final Poison POISON = new Poison();
58 private static final Freeze FREEZE = new Freeze();
59 private static final Shock SHOCK = new Shock();
60
61 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(CRUSH, STAB, DRAGONFIRE, POISON, FREEZE, SHOCK);
62 private static final CombatStrategy<Npc>[] NON_MELEE = createStrategyArray(DRAGONFIRE, POISON, FREEZE, SHOCK);
63
64 public KingBlackDragonStrategy() {
65 currentStrategy = randomStrategy(NON_MELEE);
66 }
67
68 @Override
69 public boolean withinDistance(Npc attacker, Mob defender) {
70 if (!currentStrategy.withinDistance(attacker, defender)) {
71 currentStrategy = randomStrategy(NON_MELEE);
72 }
73 return currentStrategy.withinDistance(attacker, defender);
74 }
75
76 @Override
77 public boolean canAttack(Npc attacker, Mob defender) {
78 if (!currentStrategy.canAttack(attacker, defender)) {
79 currentStrategy = randomStrategy(NON_MELEE);
80 }
81 return currentStrategy.canAttack(attacker, defender);
82 }
83
84 @Override
85 public void block(Mob attacker, Npc defender, Hit hit, CombatType combatType) {
86 currentStrategy.block(attacker, defender, hit, combatType);
87 defender.getCombat().attack(attacker);
88 }
89
90 @Override
91 public void finishOutgoing(Npc attacker, Mob defender) {
92 currentStrategy.finishOutgoing(attacker, defender);
93 if (STAB.withinDistance(attacker, defender)) {
94 currentStrategy = randomStrategy(FULL_STRATEGIES);
95 } else {
96 currentStrategy = randomStrategy(NON_MELEE);
97 }
98 }
99
100 @Override
101 public int getAttackDelay(Npc attacker, Mob defender, FightType fightType) {
102 return attacker.definition.getAttackDelay();
103 }
104
105 private static final class CrushMelee extends NpcMeleeStrategy {
106 private static final Animation ANIMATION = new Animation(80, UpdatePriority.HIGH);
107
108 @Override
109 public int getAttackDistance(Npc attacker, FightType fightType) {
110 return 1;
111 }
112
113 @Override
114 public Animation getAttackAnimation(Npc attacker, Mob defender) {
115 return ANIMATION;
116 }
117
118 @Override
119 public CombatHit[] getHits(Npc attacker, Mob defender) {
120 return new CombatHit[]{nextMeleeHit(attacker, defender)};
121 }
122 }
123
124 private static final class StabMelee extends NpcMeleeStrategy {
125 private static final Animation ANIMATION = new Animation(91, UpdatePriority.HIGH);
126
127 @Override
128 public int getAttackDistance(Npc attacker, FightType fightType) {
129 return 1;
130 }
131
132 @Override
133 public Animation getAttackAnimation(Npc attacker, Mob defender) {
134 return ANIMATION;
135 }
136
137 @Override
138 public CombatHit[] getHits(Npc attacker, Mob defender) {
139 return new CombatHit[]{nextMeleeHit(attacker, defender)};
140 }
141 }
142
143 private static final class Dragonfire extends DragonfireStrategy {
144
145 Dragonfire() {
146 super(getDefinition("KBD fire"));
147 }
148
149 @Override
150 public int getAttackDistance(Npc attacker, FightType fightType) {
151 return 10;
152 }
153
154 @Override
155 public CombatHit[] getHits(Npc attacker, Mob defender) {
156 return new CombatHit[]{CombatUtil.generateDragonfire(attacker, defender, 65, true)};
157 }
158 }
159
160 private static final class Freeze extends DragonfireStrategy {
161
162 Freeze() {
163 super(getDefinition("KBD freeze"));
164 }
165
166 @Override
167 public int getAttackDistance(Npc attacker, FightType fightType) {
168 return 10;
169 }
170
171 @Override
172 public CombatHit[] getHits(Npc attacker, Mob defender) {
173 return new CombatHit[]{CombatUtil.generateDragonfire(attacker, defender, 65, true)};
174 }
175 }
176
177 private static final class Shock extends DragonfireStrategy {
178
179 Shock() {
180 super(getDefinition("KBD shock"));
181 }
182
183 @Override
184 public int getAttackDistance(Npc attacker, FightType fightType) {
185 return 10;
186 }
187
188 @Override
189 public CombatHit[] getHits(Npc attacker, Mob defender) {
190 return new CombatHit[]{CombatUtil.generateDragonfire(attacker, defender, 65, true)};
191 }
192 }
193
194 private static final class Poison extends DragonfireStrategy {
195
196 Poison() {
197 super(getDefinition("KBD poison"));
198 }
199
200 @Override
201 public int getAttackDistance(Npc attacker, FightType fightType) {
202 return 10;
203 }
204
205 @Override
206 public CombatHit[] getHits(Npc attacker, Mob defender) {
207 return new CombatHit[]{CombatUtil.generateDragonfire(attacker, defender, 65, true)};
208 }
209 }
210
211}
abstract Combat<? extends Mob > getCombat()