RuneHive-Game
Loading...
Searching...
No Matches
BrutalDragon.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.combat.attack.listener.npc.dragon;
2
3import com.runehive.game.Animation;
4import com.runehive.game.Graphic;
5import com.runehive.game.Projectile;
6import com.runehive.game.UpdatePriority;
7import com.runehive.game.world.World;
8import com.runehive.game.world.entity.combat.attack.FightType;
9import com.runehive.game.world.entity.combat.attack.listener.NpcCombatListenerSignature;
10import com.runehive.game.world.entity.combat.attack.listener.SimplifiedListener;
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.projectile.CombatProjectile;
14import com.runehive.game.world.entity.combat.strategy.CombatStrategy;
15import com.runehive.game.world.entity.combat.strategy.npc.NpcMagicStrategy;
16import com.runehive.game.world.entity.combat.strategy.npc.NpcMeleeStrategy;
17import com.runehive.game.world.entity.combat.strategy.npc.impl.BrutalDragonfireStrategy;
18import com.runehive.game.world.entity.combat.strategy.npc.impl.DragonfireStrategy;
19import com.runehive.game.world.entity.mob.Mob;
20import com.runehive.game.world.entity.mob.npc.Npc;
21import com.runehive.util.Utility;
22
23import static com.runehive.game.world.entity.combat.CombatUtil.createStrategyArray;
24import static com.runehive.game.world.entity.combat.CombatUtil.randomStrategy;
25import static com.runehive.game.world.entity.combat.projectile.CombatProjectile.getDefinition;
26
27/** @author Michael | Chex */
292918, 7273, 7274, 7275, 8081, 8087, 8092
30})
34
35 static {
36 try {
37 DRAGONFIRE = new BrutalDragonfireStrategy(getDefinition("Chromatic dragonfire"));
38 STRATEGIES = createStrategyArray(new CrushMelee(), new StabMelee());
39 } catch (Exception e) {
40 e.printStackTrace();
41 }
42 }
43
44 @Override
45 public boolean canAttack(Npc attacker, Mob defender) {
46 final var style = Utility.random(NpcMeleeStrategy.get().withinDistance(attacker, defender) ? 1 : 2);
47 if (style == 0) {
48 attacker.setStrategy(DRAGONFIRE);
49 } else if (style == 1) {
50 attacker.setStrategy(new MagicAttack());
51 } else {
52 attacker.setStrategy(randomStrategy(STRATEGIES));
53 }
54 return attacker.getStrategy().canAttack(attacker, defender);
55 }
56
57 @Override
58 public void finishOutgoing(Npc attacker, Mob defender) {
59 final var style = Utility.random(NpcMeleeStrategy.get().withinDistance(attacker, defender) ? 1 : 2);
60 if (style == 0) {
61 attacker.setStrategy(DRAGONFIRE);
62 } else if (style == 1) {
63 attacker.setStrategy(new MagicAttack());
64 } else {
65 attacker.setStrategy(randomStrategy(STRATEGIES));
66 }
67 }
68
69 private static final class CrushMelee extends NpcMeleeStrategy {
70 private static final Animation ANIMATION = new Animation(80, UpdatePriority.HIGH);
71
72 @Override
73 public int getAttackDistance(Npc attacker, FightType fightType) {
74 return 1;
75 }
76
77 @Override
78 public Animation getAttackAnimation(Npc attacker, Mob defender) {
79 return ANIMATION;
80 }
81
82 @Override
83 public CombatHit[] getHits(Npc attacker, Mob defender) {
84 return new CombatHit[]{nextMeleeHit(attacker, defender)};
85 }
86 }
87
88 private static final class StabMelee extends NpcMeleeStrategy {
89 private static final Animation ANIMATION = new Animation(91, UpdatePriority.HIGH);
90
91 @Override
92 public int getAttackDistance(Npc attacker, FightType fightType) {
93 return 1;
94 }
95
96 @Override
97 public Animation getAttackAnimation(Npc attacker, Mob defender) {
98 return ANIMATION;
99 }
100
101 @Override
102 public CombatHit[] getHits(Npc attacker, Mob defender) {
103 return new CombatHit[]{nextMeleeHit(attacker, defender)};
104 }
105 }
106
107 private static class MagicAttack extends NpcMagicStrategy {
108 private MagicAttack() {
109 super(getDefinition("EMPTY"));
110 }
111
112 @Override
113 public Animation getAttackAnimation(Npc attacker, Mob defender) {
114 World.sendProjectile(attacker, defender, getMagicProjectile(attacker.getId()));
115 return new Animation(6722, UpdatePriority.VERY_HIGH);
116 }
117
118 @Override
119 public CombatHit[] getHits(Npc attacker, Mob defender) {
120 CombatHit combatHit = nextMagicHit(attacker, defender, getMaxHit(attacker.getId()));
121 combatHit.setAccurate(true);
122 return new CombatHit[] { combatHit };
123 }
124 }
125
126 private static int getMaxHit(int npcId) {
127 return switch (npcId) {
128 case 2918, 8081 -> 18; //green
129 case 7273 -> 21; //blue
130 case 7274, 8087 -> 22; //red
131 case 7275, 8092 -> 29; //black
132 default -> -1;
133 };
134 }
135
136 private static Projectile getMagicProjectile(int npcId) {
137 return switch (npcId) {
138 case 2918, 8081 -> new Projectile(136, 40, 90, 27, 30, 5); //green
139 case 7273 -> new Projectile(133, 40, 90, 27, 30, 5); //blue
140 case 7274, 8087 -> new Projectile(130, 40, 90, 27, 30, 5); //red
141 case 7275, 8092 -> new Projectile(88, 40, 90, 27, 30, 5); //black
142 default -> null;
143 };
144 }
145
146}
Class that models a single animation used by an entity.
Represents the game world.
Definition World.java:46
static void sendProjectile(Projectile projectile, Position position, int instance, int lock, byte offsetX, byte offsetY)
Sends a world projectile.
Definition World.java:295
A wrapper for a Hit object, adding additional variables for hit and hitsplat delays.
final CombatHit nextMagicHit(T attacker, Mob defender)
Handles the mob class.
Definition Mob.java:66
Represents a non-player character in the in-game world.
Definition Npc.java:29
void setStrategy(CombatStrategy< Npc > strategy)
Definition Npc.java:212
CombatStrategy< Npc > getStrategy()
The combat strategy of the mob.
Definition Npc.java:161
Handles miscellaneous methods.
Definition Utility.java:27
static int random(int bound)
Definition Utility.java:239
Represents different priorities for updating.
The enumerated type whose elements represent the fighting types.