RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
LizardShaman.java
1package com.osroyale.game.world.entity.combat.strategy.npc.boss;
2
3import com.osroyale.game.Animation;
4import com.osroyale.game.Graphic;
5import com.osroyale.game.UpdatePriority;
6import com.osroyale.game.task.Task;
7import com.osroyale.game.world.World;
8import com.osroyale.game.world.entity.combat.CombatType;
9import com.osroyale.game.world.entity.combat.CombatUtil;
10import com.osroyale.game.world.entity.combat.hit.CombatHit;
11import com.osroyale.game.world.entity.combat.hit.Hit;
12import com.osroyale.game.world.entity.combat.hit.HitIcon;
13import com.osroyale.game.world.entity.combat.hit.Hitsplat;
14import com.osroyale.game.world.entity.combat.projectile.CombatProjectile;
15import com.osroyale.game.world.entity.combat.strategy.CombatStrategy;
16import com.osroyale.game.world.entity.combat.strategy.npc.MultiStrategy;
17import com.osroyale.game.world.entity.combat.strategy.npc.NpcMagicStrategy;
18import com.osroyale.game.world.entity.combat.strategy.npc.NpcMeleeStrategy;
19import com.osroyale.game.world.entity.mob.Mob;
20import com.osroyale.game.world.entity.mob.npc.Npc;
21import com.osroyale.game.world.position.Position;
22import com.osroyale.util.Utility;
23
24import static com.osroyale.game.world.entity.combat.CombatUtil.createStrategyArray;
25import static com.osroyale.game.world.entity.combat.CombatUtil.randomStrategy;
26import static com.osroyale.game.world.items.containers.equipment.Equipment.SHAYZIEN_PIECES;
27
62
63public class LizardShaman extends MultiStrategy {
64 private static final MagicAttack MAGIC = new MagicAttack();
65 private static final AcidAttack ACID = new AcidAttack();
66 private static final MinionsAttack MINION = new MinionsAttack();
67 private static final JumpAttack JUMP = new JumpAttack();
68 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(NpcMeleeStrategy.get(), ACID, MAGIC, MAGIC, MAGIC, MINION, JUMP);
69 private static final CombatStrategy<Npc>[] MAGIC_STRATEGIES = createStrategyArray(ACID, MAGIC, MAGIC, MAGIC, MINION);
70 private static final CombatStrategy<Npc>[] BASIC_STRATEGIES = createStrategyArray(ACID, MAGIC, MAGIC, MAGIC, JUMP);
71
72 public LizardShaman() {
73 currentStrategy = NpcMeleeStrategy.get();
74 }
75
76 @Override
77 public boolean canAttack(Npc attacker, Mob defender) {
78 if (NpcMeleeStrategy.get().canAttack(attacker, defender)) {
79 currentStrategy = randomStrategy(FULL_STRATEGIES);
80 } else {
81 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
82 }
83
84 boolean spawned = attacker.attributes.is("LIZARD_SPAWNED");
85
86 if (currentStrategy == MINION && spawned) {
87 currentStrategy = randomStrategy(BASIC_STRATEGIES);
88 }
89
90 return currentStrategy.canAttack(attacker, defender);
91 }
92
93 private static class JumpAttack extends NpcMagicStrategy {
94 JumpAttack() {
95 super(CombatProjectile.getDefinition("EMPTY"));
96 }
97
98 @Override
99 public void hit(Npc attacker, Mob defender, Hit hit) {
100 }
101
102 @Override
103 public void block(Mob attacker, Npc defender, Hit hit, CombatType combatType) {
104 }
105
106 @Override
107 public void start(Npc attacker, Mob defender, Hit[] hits) {
108 Position position = defender.getPosition();
109 attacker.animate(new Animation(7152, UpdatePriority.VERY_HIGH));
110
111 World.schedule(new Task(1) {
112 int count = 0;
113
114 @Override
115 protected void execute() {
116 count++;
117
118 if (count == 2) {
119 attacker.setVisible(false);
120 } else if (count == 3) {
121 attacker.move(position);
122 } else if (count == 4) {
123 attacker.setVisible(true);
124 attacker.animate(new Animation(6946, UpdatePriority.VERY_HIGH));
125 } else if (count == 5) {
126 CombatUtil.areaAction(defender, actor -> {
127 if (actor.getPosition().equals(position)) {
128 actor.damage(new Hit(Utility.random(10, 15), HitIcon.MELEE));
129 actor.movement.reset();
130 }
131 });
132 cancel();
133 }
134 }
135
136 @Override
137 protected void onCancel(boolean logout) {
138 attacker.attack(defender);
139 }
140 });
141 }
142
143 @Override
144 public CombatHit[] getHits(Npc attacker, Mob defender) {
145 return new CombatHit[]{};
146 }
147 }
148
149 private static class MinionsAttack extends NpcMagicStrategy {
150 MinionsAttack() {
151 super(CombatProjectile.getDefinition("EMPTY"));
152 }
153
154 @Override
155 public void hit(Npc attacker, Mob defender, Hit hit) {
156 }
157
158 @Override
159 public void block(Mob attacker, Npc defender, Hit hit, CombatType combatType) {
160 }
161
162 @Override
163 public void start(Npc attacker, Mob defender, Hit[] hits) {
164 attacker.attributes.set("LIZARD_SPAWNED", Boolean.TRUE);
165 for (int index = 0; index < 3; index++) {
166 Npc minion = new Npc(6768, Utility.randomElement(attacker.boundaries));
167 minion.register();
168 minion.follow(defender);
169
170 World.schedule(8, () -> {
171 World.sendGraphic(new Graphic(1295), minion.getPosition(), attacker.instance);
172
173 if (defender.getPosition().isWithinDistance(minion.getPosition(), 3)) {
174 defender.damage(new Hit(Utility.random(8) + 2));
175 }
176
177 minion.unregister();
178 attacker.attributes.set("LIZARD_SPAWNED", Boolean.FALSE);
179 });
180 }
181 }
182
183 @Override
184 public CombatHit[] getHits(Npc attacker, Mob defender) {
185 return new CombatHit[]{};
186 }
187 }
188
189 private static class MagicAttack extends NpcMagicStrategy {
190 MagicAttack() {
191 super(CombatProjectile.getDefinition("Shaman magic"));
192 }
193
194 @Override
195 public Animation getAttackAnimation(Npc attacker, Mob defender) {
196 return new Animation(7193, UpdatePriority.HIGH);
197 }
198
199 @Override
200 public CombatHit[] getHits(Npc attacker, Mob defender) {
201 CombatHit combatHit = nextMagicHit(attacker, defender, 31);
202 combatHit.setAccurate(true);
203 return new CombatHit[]{combatHit};
204 }
205 }
206
207 private static class AcidAttack extends NpcMagicStrategy {
208 AcidAttack() {
209 super(CombatProjectile.getDefinition("Shaman acid"));
210 }
211
212 @Override
213 public Animation getAttackAnimation(Npc attacker, Mob defender) {
214 return new Animation(7193, UpdatePriority.HIGH);
215 }
216
217 @Override
218 public CombatHit[] getHits(Npc attacker, Mob defender) {
219 CombatHit combatHit = nextMagicHit(attacker, defender);
220 combatHit.setHitsplat(Hitsplat.POISON);
221 combatHit.setIcon(HitIcon.NONE);
222 combatHit.setAccurate(false);
223 int itemCount = 0;
224 for (int index = 0; index < SHAYZIEN_PIECES.length; index++) {
225 if (defender.getPlayer().equipment.contains(SHAYZIEN_PIECES[index][0])) {
226 itemCount++;
227 }
228 }
229 int damage = (itemCount == SHAYZIEN_PIECES.length) ? 0 : Utility.random(25 - 5 * itemCount, 30 - 5 * itemCount);
230 combatHit.setDamage(damage);
231 return new CombatHit[]{combatHit};
232 }
233 }
234}
static void sendGraphic(Graphic graphic, Position position, int instance)
Definition World.java:305
static void schedule(Task task)
Definition World.java:284
static void areaAction(Mob mob, Consumer< Mob > action)
void move(Position position)
Definition Mob.java:377
boolean isWithinDistance(Position other, int radius)
static< T > T randomElement(Collection< T > collection)
Definition Utility.java:285