RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
DarkBow.java
1package com.osroyale.game.world.entity.combat.strategy.player.special.range;
2
3import com.osroyale.content.achievement.AchievementHandler;
4import com.osroyale.content.achievement.AchievementKey;
5import com.osroyale.game.Graphic;
6import com.osroyale.game.Projectile;
7import com.osroyale.game.UpdatePriority;
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.projectile.CombatProjectile;
11import com.osroyale.game.world.entity.combat.strategy.player.PlayerRangedStrategy;
12import com.osroyale.game.world.entity.mob.Mob;
13import com.osroyale.game.world.entity.mob.player.Player;
14import com.osroyale.game.world.items.Item;
15
16import static com.osroyale.game.world.items.containers.equipment.Equipment.ARROWS_SLOT;
17
58
59public class DarkBow extends PlayerRangedStrategy {
60 private static final DarkBow INSTANCE = new DarkBow();
61
62 private static Projectile DARKNESS_PROJECTILE_1;
63 private static Projectile DARKNESS_PROJECTILE_2;
64
65 private static Projectile DRAGONS_PROJECTILE_1;
66 private static Projectile DRAGONS_PROJECTILE_2;
67
68 static {
69 try {
70 CombatProjectile darkness = CombatProjectile.getDefinition("Dark Bow Darkness");
71 CombatProjectile dragons = CombatProjectile.getDefinition("Dark Bow Dragons");
72 setProjectiles(darkness, dragons);
73 } catch (Exception e) {
74 e.printStackTrace();
75 }
76 }
77
78 private DarkBow() {
79 }
80
81 @Override
82 protected void sendStuff(Player attacker, Mob defender) {
83 super.sendStuff(attacker, defender);
84
85 if (isDragonArrow(attacker.equipment.get(ARROWS_SLOT))) {
86 DRAGONS_PROJECTILE_1.send(attacker, defender);
87 DRAGONS_PROJECTILE_2.send(attacker, defender);
88 } else {
89 DARKNESS_PROJECTILE_1.send(attacker, defender);
90 DARKNESS_PROJECTILE_2.send(attacker, defender);
91 }
92 }
93
94 @Override
95 public void hit(Player attacker, Mob defender, Hit hit) {
96 if (isDragonArrow(attacker.equipment.get(ARROWS_SLOT))) {
97 defender.graphic(new Graphic(1100, true, UpdatePriority.HIGH));
98 } else {
99 defender.graphic(new Graphic(1103, true, UpdatePriority.HIGH));
100 }
101 super.hit(attacker, defender, hit);
102 }
103
104 @Override
105 public CombatHit[] getHits(Player attacker, Mob defender) {
106 CombatHit first = nextRangedHit(attacker, defender);
107 CombatHit second = nextRangedHit(attacker, defender);
108 int minimum = isDragonArrow(attacker.equipment.get(ARROWS_SLOT)) ? 8 : 5;
109
110 if (first.getDamage() < minimum) {
111 first.setDamage(minimum);
112 first.setAccurate(true);
113 }
114
115 if (second.getDamage() < minimum) {
116 second.setDamage(minimum);
117 second.setAccurate(true);
118 }
119
120 return new CombatHit[] { first, second };
121 }
122
123 @Override
124 public int modifyDamage(Player attacker, Mob defender, int roll) {
125 if (isDragonArrow(attacker.equipment.get(ARROWS_SLOT)))
126 return roll * 3 / 2;
127 return roll * 13 / 10;
128 }
129
130 @Override
131 public void onKill(Player attacker, Mob defender, Hit hit) {
132 if (defender.isPlayer()) {
133 AchievementHandler.activate(attacker, AchievementKey.DARKBOW_SPEC);
134 }
135 }
136
137 private static void setProjectiles(CombatProjectile darkness, CombatProjectile dragons) {
138 if (!darkness.getProjectile().isPresent())
139 throw new NullPointerException("No Decent of Darkness projectile found.");
140
141 DARKNESS_PROJECTILE_1 = darkness.getProjectile().get();
142
143 DARKNESS_PROJECTILE_2 = DARKNESS_PROJECTILE_1.copy();
144 DARKNESS_PROJECTILE_2.setDuration(15 + DARKNESS_PROJECTILE_2.getDuration());
145 DARKNESS_PROJECTILE_2.setCurve(32);
146
147 if (!dragons.getProjectile().isPresent())
148 throw new NullPointerException("No Decent of Dragons projectile found.");
149
150 DRAGONS_PROJECTILE_1 = dragons.getProjectile().get().copy();
151
152 DRAGONS_PROJECTILE_2 = DRAGONS_PROJECTILE_1.copy();
153 DRAGONS_PROJECTILE_2.setDuration(15 + DRAGONS_PROJECTILE_1.getDuration());
154 DRAGONS_PROJECTILE_2.setCurve(32);
155 }
156
157 private static boolean isDragonArrow(Item item) {
158 if (item != null) {
159 int id = item.getId();
160 return id == 11212 || id == 11227 || id == 11228 || id == 11229;
161 }
162 return false;
163 }
164
165 public static DarkBow get() {
166 return INSTANCE;
167 }
168
169}
static void activate(Player player, AchievementKey achievement)