RuneHive-Game
Loading...
Searching...
No Matches
LizardShaman.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.combat.strategy.npc.boss;
2
3import com.runehive.game.Animation;
4import com.runehive.game.Graphic;
5import com.runehive.game.UpdatePriority;
6import com.runehive.game.task.Task;
7import com.runehive.game.world.World;
8import com.runehive.game.world.entity.combat.CombatType;
9import com.runehive.game.world.entity.combat.CombatUtil;
10import com.runehive.game.world.entity.combat.hit.CombatHit;
11import com.runehive.game.world.entity.combat.hit.Hit;
12import com.runehive.game.world.entity.combat.hit.HitIcon;
13import com.runehive.game.world.entity.combat.hit.Hitsplat;
14import com.runehive.game.world.entity.combat.projectile.CombatProjectile;
15import com.runehive.game.world.entity.combat.strategy.CombatStrategy;
16import com.runehive.game.world.entity.combat.strategy.npc.MultiStrategy;
17import com.runehive.game.world.entity.combat.strategy.npc.NpcMagicStrategy;
18import com.runehive.game.world.entity.combat.strategy.npc.NpcMeleeStrategy;
19import com.runehive.game.world.entity.mob.Mob;
20import com.runehive.game.world.entity.mob.npc.Npc;
21import com.runehive.game.world.position.Position;
22import com.runehive.util.Utility;
23
24import static com.runehive.game.world.entity.combat.CombatUtil.createStrategyArray;
25import static com.runehive.game.world.entity.combat.CombatUtil.randomStrategy;
26import static com.runehive.game.world.items.containers.equipment.Equipment.SHAYZIEN_PIECES;
27
28public class LizardShaman extends MultiStrategy {
29 private static final MagicAttack MAGIC = new MagicAttack();
30 private static final AcidAttack ACID = new AcidAttack();
31 private static final MinionsAttack MINION = new MinionsAttack();
32 private static final JumpAttack JUMP = new JumpAttack();
33 private static final CombatStrategy<Npc>[] FULL_STRATEGIES = createStrategyArray(NpcMeleeStrategy.get(), ACID, MAGIC, MAGIC, MAGIC, MINION, JUMP);
34 private static final CombatStrategy<Npc>[] MAGIC_STRATEGIES = createStrategyArray(ACID, MAGIC, MAGIC, MAGIC, MINION);
35 private static final CombatStrategy<Npc>[] BASIC_STRATEGIES = createStrategyArray(ACID, MAGIC, MAGIC, MAGIC, JUMP);
36
40
41 @Override
42 public boolean canAttack(Npc attacker, Mob defender) {
43 if (NpcMeleeStrategy.get().canAttack(attacker, defender)) {
44 currentStrategy = randomStrategy(FULL_STRATEGIES);
45 } else {
46 currentStrategy = randomStrategy(MAGIC_STRATEGIES);
47 }
48
49 boolean spawned = attacker.attributes.is("LIZARD_SPAWNED");
50
51 if (currentStrategy == MINION && spawned) {
52 currentStrategy = randomStrategy(BASIC_STRATEGIES);
53 }
54
55 return currentStrategy.canAttack(attacker, defender);
56 }
57
58 private static class JumpAttack extends NpcMagicStrategy {
60 super(CombatProjectile.getDefinition("EMPTY"));
61 }
62
63 @Override
64 public void hit(Npc attacker, Mob defender, Hit hit) {
65 }
66
67 @Override
68 public void block(Mob attacker, Npc defender, Hit hit, CombatType combatType) {
69 }
70
71 @Override
72 public void start(Npc attacker, Mob defender, Hit[] hits) {
73 Position position = defender.getPosition();
74 attacker.animate(new Animation(7152, UpdatePriority.VERY_HIGH));
75
76 World.schedule(new Task(1) {
77 int count = 0;
78
79 @Override
80 protected void execute() {
81 count++;
82
83 if (count == 2) {
84 attacker.setVisible(false);
85 } else if (count == 3) {
86 attacker.move(position);
87 } else if (count == 4) {
88 attacker.setVisible(true);
89 attacker.animate(new Animation(6946, UpdatePriority.VERY_HIGH));
90 } else if (count == 5) {
91 CombatUtil.areaAction(defender, actor -> {
92 if (actor.getPosition().equals(position)) {
93 actor.damage(new Hit(Utility.random(10, 15), HitIcon.MELEE));
94 actor.movement.reset();
95 }
96 });
97 cancel();
98 }
99 }
100
101 @Override
102 protected void onCancel(boolean logout) {
103 attacker.attack(defender);
104 }
105 });
106 }
107
108 @Override
109 public CombatHit[] getHits(Npc attacker, Mob defender) {
110 return new CombatHit[]{};
111 }
112 }
113
114 private static class MinionsAttack extends NpcMagicStrategy {
116 super(CombatProjectile.getDefinition("EMPTY"));
117 }
118
119 @Override
120 public void hit(Npc attacker, Mob defender, Hit hit) {
121 }
122
123 @Override
124 public void block(Mob attacker, Npc defender, Hit hit, CombatType combatType) {
125 }
126
127 @Override
128 public void start(Npc attacker, Mob defender, Hit[] hits) {
129 attacker.attributes.set("LIZARD_SPAWNED", Boolean.TRUE);
130 for (int index = 0; index < 3; index++) {
131 Npc minion = new Npc(6768, Utility.randomElement(attacker.boundaries));
132 minion.register();
133 minion.follow(defender);
134
135 World.schedule(8, () -> {
136 World.sendGraphic(new Graphic(1295), minion.getPosition(), attacker.instance);
137
138 if (defender.getPosition().isWithinDistance(minion.getPosition(), 3)) {
139 defender.damage(new Hit(Utility.random(8) + 2));
140 }
141
142 minion.unregister();
143 attacker.attributes.set("LIZARD_SPAWNED", Boolean.FALSE);
144 });
145 }
146 }
147
148 @Override
149 public CombatHit[] getHits(Npc attacker, Mob defender) {
150 return new CombatHit[]{};
151 }
152 }
153
154 private static class MagicAttack extends NpcMagicStrategy {
156 super(CombatProjectile.getDefinition("Shaman magic"));
157 }
158
159 @Override
160 public Animation getAttackAnimation(Npc attacker, Mob defender) {
161 return new Animation(7193, UpdatePriority.HIGH);
162 }
163
164 @Override
165 public CombatHit[] getHits(Npc attacker, Mob defender) {
166 CombatHit combatHit = nextMagicHit(attacker, defender, 31);
167 combatHit.setAccurate(true);
168 return new CombatHit[]{combatHit};
169 }
170 }
171
172 private static class AcidAttack extends NpcMagicStrategy {
174 super(CombatProjectile.getDefinition("Shaman acid"));
175 }
176
177 @Override
178 public Animation getAttackAnimation(Npc attacker, Mob defender) {
179 return new Animation(7193, UpdatePriority.HIGH);
180 }
181
182 @Override
183 public CombatHit[] getHits(Npc attacker, Mob defender) {
184 CombatHit combatHit = nextMagicHit(attacker, defender);
185 combatHit.setHitsplat(Hitsplat.POISON);
186 combatHit.setIcon(HitIcon.NONE);
187 combatHit.setAccurate(false);
188 int itemCount = 0;
189 for (int index = 0; index < SHAYZIEN_PIECES.length; index++) {
190 if (defender.getPlayer().equipment.contains(SHAYZIEN_PIECES[index][0])) {
191 itemCount++;
192 }
193 }
194 int damage = (itemCount == SHAYZIEN_PIECES.length) ? 0 : Utility.random(25 - 5 * itemCount, 30 - 5 * itemCount);
195 combatHit.setDamage(damage);
196 return new CombatHit[]{combatHit};
197 }
198 }
199}
Class that models a single animation used by an entity.
Represents a single graphic that can be used by entities.
Definition Graphic.java:10
A game representing a cyclic unit of work.
Definition Task.java:11
Represents the game world.
Definition World.java:46
static void schedule(Task task)
Submits a new event.
Definition World.java:247
static void sendGraphic(Graphic graphic, Position position, int instance)
Sends a graphic to the world.
Definition World.java:268
void setVisible(boolean visible)
Definition Entity.java:102
A collection of util methods and constants related to combat.
static void areaAction(Mob mob, Consumer< Mob > action)
Executes an action for mobs within a 3x3 square, including the source mob.
A wrapper for a Hit object, adding additional variables for hit and hitsplat delays.
A Hit object holds the damage amount and hitsplat data.
Definition Hit.java:10
void setIcon(HitIcon hitIcon)
Sets the hit icon.
Definition Hit.java:159
void setDamage(int damage)
Sets the hit damage.
Definition Hit.java:98
void setHitsplat(Hitsplat hitsplat)
Definition Hit.java:163
final CombatHit nextMagicHit(T attacker, Mob defender)
void block(Mob attacker, Npc defender, Hit hit, CombatType combatType)
void block(Mob attacker, Npc defender, Hit hit, CombatType combatType)
Handles the mob class.
Definition Mob.java:66
final GenericAttributes attributes
Definition Mob.java:95
void move(Position position)
Moves the mob to a set position.
Definition Mob.java:340
Represents a non-player character in the in-game world.
Definition Npc.java:29
void register()
Registers an entity to the World.
Definition Npc.java:112
void unregister()
Unregisters an entity from the World.
Definition Npc.java:126
boolean contains(int[] bowsWithNoArrowsRequired)
Represents a single tile on the game world.
Definition Position.java:14
boolean isWithinDistance(Position other, int radius)
Checks if this location is within range of another.
Handles miscellaneous methods.
Definition Utility.java:27
static int random(int bound)
Definition Utility.java:239
static< T > T randomElement(Collection< T > collection)
Picks a random element out of any array type.
Definition Utility.java:248
public< K > boolean is(K key)
Gets the state of a key.
public< K, E > void set(K key, E attribute)
Sets a generic attribute.
Represents different priorities for updating.
The enumerated type whose elements represent the hit icon of a Hit.
Definition HitIcon.java:8
MELEE
Represents the melee sword hit icon.
Definition HitIcon.java:14