RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
Fletching.java
1package com.osroyale.content.skill.impl.fletching;
2
3import com.osroyale.Config;
4import com.osroyale.content.achievement.AchievementHandler;
5import com.osroyale.content.achievement.AchievementKey;
6import com.osroyale.content.activity.randomevent.RandomEventHandler;
7import com.osroyale.content.clanchannel.content.ClanTaskKey;
8import com.osroyale.content.event.impl.ClickButtonInteractionEvent;
9import com.osroyale.content.event.impl.ItemOnItemInteractionEvent;
10import com.osroyale.content.skill.impl.firemaking.FiremakingData;
11import com.osroyale.content.skill.impl.fletching.impl.Arrow;
12import com.osroyale.content.skill.impl.fletching.impl.Carvable;
13import com.osroyale.content.skill.impl.fletching.impl.Stringable;
14import com.osroyale.content.skillcape.SkillCape;
15import com.osroyale.game.Animation;
16import com.osroyale.game.Graphic;
17import com.osroyale.game.action.Action;
18import com.osroyale.game.action.policy.WalkablePolicy;
19import com.osroyale.game.world.entity.mob.player.Player;
20import com.osroyale.game.world.entity.skill.Skill;
21import com.osroyale.game.world.items.Item;
22import com.osroyale.net.packet.out.*;
23import com.osroyale.util.Utility;
24import org.apache.logging.log4j.LogManager;
25import org.apache.logging.log4j.Logger;
26
27import java.util.HashMap;
28
70
71public class Fletching extends Skill {
72
73 private static final Logger logger = LogManager.getLogger(Fletching.class);
74
75 private static final String FLETCHABLE_KEY = "FLETCHABLE_KEY";
76
77 private final static HashMap<Integer, Fletchable> FLETCHABLES = new HashMap<>();
78
79 public Fletching(int level, double experience) {
80 super(Skill.FLETCHING, level, experience);
81 }
82
83 public static void addFletchable(Fletchable fletchable) {
84 if (FLETCHABLES.put(fletchable.getWith().getId(), fletchable) != null) {
85 System.out.println("[Fletching] Conflicting item values: " + fletchable.getWith().getId() + " Type: " + fletchable.getClass().getSimpleName());
86 }
87 }
88
89 private Fletchable getFletchable(int use, int with) {
90 return FLETCHABLES.getOrDefault(use, FLETCHABLES.get(with));
91 }
92
93 @Override
94 protected double modifier() {
96 }
97
98 @Override
99 protected boolean useItem(Player player, ItemOnItemInteractionEvent event) {
100 Item first = event.getFirst();
101 Item second = event.getSecond();
102
103 if (FiremakingData.forId(first.getId()).isPresent() && FiremakingData.forId(second.getId()).isPresent()) {
104 return false;
105 }
106
107 Fletchable fletchable = getFletchable(first.getId(), second.getId());
108
109 if (fletchable == null || first.getId() == 590 || second.getId() == 590 || first.getId() == 8792 || second.getId() == 8792) {
110 return false;
111 }
112
113 if (!fletchable.getUse().equalIds(first) && !fletchable.getUse().equalIds(second)) {
114 player.message("You need to use this with " + Utility.getAOrAn(fletchable.getUse().getName()) + " " + fletchable.getUse().getName().toLowerCase() + " to fletch this item.");
115 return true;
116 }
117
118 String prefix = fletchable.getWith().getName().split(" ")[0];
119
120 switch (fletchable.getFletchableItems().length) {
121
122 case 1:
123 player.attributes.set(FLETCHABLE_KEY, fletchable);
124 player.send(new SendString("\\n \\n \\n \\n" + fletchable.getFletchableItems()[0].getProduct().getName(), 2799));
125 player.send(new SendItemOnInterfaceZoom(1746, 170, fletchable.getFletchableItems()[0].getProduct().getId()));
126 player.send(new SendChatBoxInterface(4429));
127 return true;
128 case 2:
129 player.attributes.set(FLETCHABLE_KEY, fletchable);
130 player.send(new SendItemOnInterfaceZoom(8869, 170, fletchable.getFletchableItems()[0].getProduct().getId()));
131 player.send(new SendItemOnInterfaceZoom(8870, 170, fletchable.getFletchableItems()[1].getProduct().getId()));
132 player.send(new SendString("\\n \\n \\n \\n".concat(prefix + " Short Bow"), 8874));
133 player.send(new SendString("\\n \\n \\n \\n".concat(prefix + " Long Bow"), 8878));
134 player.send(new SendChatBoxInterface(8866));
135 return true;
136 case 3:
137 player.attributes.set(FLETCHABLE_KEY, fletchable);
138 player.send(new SendItemOnInterfaceZoom(8883, 170, fletchable.getFletchableItems()[0].getProduct().getId()));
139 player.send(new SendItemOnInterfaceZoom(8884, 170, fletchable.getFletchableItems()[1].getProduct().getId()));
140 player.send(new SendItemOnInterfaceZoom(8885, 170, fletchable.getFletchableItems()[2].getProduct().getId()));
141 player.send(new SendString("\\n \\n \\n \\n".concat("Arrow heads"), 8889));
142 player.send(new SendString("\\n \\n \\n \\n".concat(prefix + " Short Bow"), 8893));
143 player.send(new SendString("\\n \\n \\n \\n".concat(prefix + " Long Bow"), 8897));
144 player.send(new SendChatBoxInterface(8880));
145 return true;
146 case 4:
147 player.attributes.set(FLETCHABLE_KEY, fletchable);
148 player.send(new SendItemOnInterfaceZoom(8902, 170, fletchable.getFletchableItems()[0].getProduct().getId()));
149 player.send(new SendItemOnInterfaceZoom(8903, 170, fletchable.getFletchableItems()[1].getProduct().getId()));
150 player.send(new SendItemOnInterfaceZoom(8904, 170, fletchable.getFletchableItems()[2].getProduct().getId()));
151 player.send(new SendItemOnInterfaceZoom(8905, 170, fletchable.getFletchableItems()[3].getProduct().getId()));
152
153 String[] productNames;
154 if (fletchable == Carvable.AMETHYST) {
155 productNames = new String[]{"Arrowtips", "Bolt tips", "Javelin heads", "Dart tips"};
156 } else {
157 productNames = new String[]{"Arrow Shafts", "Short Bow", "Long Bow", "Crossbow Stock"};
158 }
159
160 player.send(new SendString("\\n \\n \\n \\n".concat(productNames[0]), 8909));
161 player.send(new SendString("\\n \\n \\n \\n".concat(productNames[1]), 8913));
162 player.send(new SendString("\\n \\n \\n \\n".concat(productNames[2]), 8917));
163 player.send(new SendString("\\n \\n \\n \\n".concat(productNames[3]), 8921));
164 player.send(new SendChatBoxInterface(8899));
165 return true;
166 default:
167 return false;
168 }
169 }
170
171 @Override
172 protected boolean clickButton(Player player, ClickButtonInteractionEvent event) {
173 if (player.attributes.get(FLETCHABLE_KEY, Fletchable.class) == null) {
174 return false;
175 }
176
177 Fletchable fletchable = player.attributes.get(FLETCHABLE_KEY, Fletchable.class);
178
179 int button = event.getButton();
180
181 switch (button) {
182
183 /* Option 1 - Make all */
184 case 1747:
185 start(player, fletchable, 0, 15);
186 return true;
187
188 /* Option 1 - Make 1 */
189 case 2799:
190 case 8909:
191 case 8874:
192 case 8889:
193 start(player, fletchable, 0, 1);
194 return true;
195
196 /* Option 1 - Make 5 */
197 case 2798:
198 case 8908:
199 case 8873:
200 case 8888:
201 start(player, fletchable, 0, 5);
202 return true;
203
204 /* Option 1 - Make 10 */
205 case 8907:
206 case 8872:
207 case 8887:
208 start(player, fletchable, 0, 10);
209 return true;
210 //TODO: Make X limited to 150.
211
212 /* Option 1 - Make X */
213 case 1748:
214 case 8906:
215 case 8871:
216 case 8886:
217 case 6212:
218 try {
219 player.send(new SendInputAmount("Enter amount", 3, input ->
220 start(player, fletchable, 0, Integer.parseInt(input))));
221
222 } catch (Exception ex) {
223 logger.error(String.format("player=%s error fletching option1: make-x", player.getName()), ex);
224 }
225 return true;
226
227 /* Option 2 - Make 1 */
228 case 8913:
229 case 8878:
230 case 8893:
231 start(player, fletchable, 1, 1);
232 return true;
233
234 /* Option 2 - Make 5 */
235 case 8912:
236 case 8877:
237 case 8892:
238 start(player, fletchable, 1, 5);
239 return true;
240
241 /* Option 2 - Make 10 */
242 case 8911:
243 case 8876:
244 case 8891:
245 start(player, fletchable, 1, 10);
246 return true;
247
248 /* Option 2 - Make X */
249 case 8910:
250 case 8875:
251 case 8890:
252 try {
253 player.send(new SendInputAmount("Enter amount", 2, input -> start(player, fletchable, 1, Integer.parseInt(input))));
254 } catch (Exception ex) {
255 logger.error(String.format("player=%s error fletching option2: make-x", player.getName()), ex);
256 }
257 return true;
258
259 /* Option 3 - Make 1 */
260 case 8917:
261 case 8897:
262 start(player, fletchable, 2, 1);
263 return true;
264
265 /* Option 3 - Make 5 */
266 case 8916:
267 case 8896:
268 start(player, fletchable, 2, 5);
269 return true;
270
271 /* Option 3 - Make 10 */
272 case 8915:
273 case 8895:
274 start(player, fletchable, 2, 10);
275 return true;
276
277 /* Option 3 - Make X */
278 case 8914:
279 case 8894:
280 try {
281 player.send(new SendInputAmount("Enter amount", 2, input -> start(player, fletchable, 2, Integer.parseInt(input))));
282 } catch (Exception ex) {
283 logger.error(String.format("player=%s error fletching option3: make-x", player.getName()), ex);
284 }
285 return true;
286
287 /* Option 4 - Make 1 */
288 case 8921:
289 start(player, fletchable, 3, 1);
290 return true;
291
292 /* Option 4 - Make 5 */
293 case 8920:
294 start(player, fletchable, 3, 5);
295 return true;
296
297 /* Option 4 - Make 10 */
298 case 8919:
299 start(player, fletchable, 3, 10);
300 return true;
301
302 /* Option 4 - Make X */
303 case 8918:
304 try {
305
306 player.send(new SendInputAmount("Enter amount", 2, input -> start(player, fletchable, 3, Integer.parseInt(input))));
307 } catch (Exception ex) {
308 logger.error(String.format("player=%s error fletching option3: make-x", player.getName()), ex);
309 }
310 return true;
311
312 default:
313 return false;
314 }
315 }
316
317 public boolean fletch(Player player, int index, int amount) {
318 Fletchable fletchable = player.attributes.get(FLETCHABLE_KEY);
319
320 if (fletchable == null) {
321 return false;
322 }
323
324 return start(player, fletchable, index, amount);
325
326 }
327
328 public boolean start(Player player, Fletchable fletchable, int index, int amount) {
329 if (fletchable == null) {
330 return false;
331 }
332
333 player.attributes.remove(FLETCHABLE_KEY);
334 FletchableItem item = fletchable.getFletchableItems()[index];
335 player.interfaceManager.close();
336
337 if (player.skills.getLevel(Skill.FLETCHING) < item.getLevel()) {
338 player.dialogueFactory.sendStatement("<col=369>You need a Fletching level of " + item.getLevel() + " to do that.").execute();
339 return true;
340 }
341
342 if (!(player.inventory.containsAll(fletchable.getIngredients()))) {
343 String firstName = fletchable.getUse().getName().toLowerCase();
344 String secondName = fletchable.getWith().getName().toLowerCase();
345
346 if (fletchable.getUse().getAmount() > 1 && !firstName.endsWith("s")) {
347 firstName = firstName.concat("s");
348 }
349
350 if (fletchable.getWith().getAmount() > 1 && !secondName.endsWith("s")) {
351 secondName = secondName.concat("s");
352 }
353
354 if (fletchable.getUse().getAmount() == 1 && firstName.endsWith("s")) {
355 firstName = firstName.substring(0, firstName.length() - 1);
356 }
357
358 if (fletchable.getWith().getAmount() == 1 && secondName.endsWith("s")) {
359 secondName = secondName.substring(0, secondName.length() - 1);
360 }
361
362 final String firstAmount;
363
364 if (fletchable.getUse().getAmount() == 1) {
365 firstAmount = Utility.getAOrAn(fletchable.getUse().getName());
366 } else {
367 firstAmount = String.valueOf(fletchable.getUse().getAmount());
368 }
369
370 final String secondAmount;
371
372 if (fletchable.getWith().getAmount() == 1) {
373 secondAmount = Utility.getAOrAn(fletchable.getWith().getName());
374 } else {
375 secondAmount = String.valueOf(fletchable.getWith().getAmount());
376 }
377
378 String firstRequirement = firstAmount + " " + firstName;
379 String secondRequirement = secondAmount + " " + secondName;
380 player.send(new SendMessage("You need " + firstRequirement + " and " + secondRequirement + " to do that."));
381 return true;
382 }
383
384 player.action.execute(fletch(player, fletchable, item, amount), true);
385 return true;
386 }
387
388 private Action<Player> fletch(Player player, Fletchable fletchable, FletchableItem item, int amount) {
389 return new Action<Player>(player, 2, true) {
390 int iterations = 0;
391
392 @Override
393 public void execute() {
394 ++iterations;
395 player.animate(new Animation(fletchable.getAnimation()));
396 player.graphic(new Graphic(fletchable.getGraphics()));
397 final boolean saveMaterial = SkillCape.isEquipped(player, SkillCape.FLETCHING) && Utility.random(1, 3) == 1;
398
399 if (fletchable == Carvable.AMETHYST) {
400 player.skills.addExperience(Skill.CRAFTING, item.getExperience() * modifier());
401 } else {
402 player.skills.addExperience(Skill.FLETCHING, item.getExperience() * modifier());
403 }
404
405 if (!saveMaterial) {
406 player.inventory.removeAll(fletchable.getIngredients());
407 }
408
409 player.inventory.addOrDrop(item.getProduct());
410 player.playerAssistant.activateSkilling(1);
411 RandomEventHandler.trigger(player);
412
413 if (fletchable.getProductionMessage() != null) {
414 player.send(new SendMessage(fletchable.getProductionMessage()));
415 }
416
417 if (fletchable == Stringable.MAGIC_SHORTBOWS) {
418 getMob().forClan(channel -> channel.activateTask(ClanTaskKey.MAGIC_SHORTBOW, getMob().getName()));
419 } else if (fletchable == Stringable.YEW_SHORTBOWS) {
420 getMob().forClan(channel -> channel.activateTask(ClanTaskKey.YEW_SHORTBOW, getMob().getName()));
421 } else if (fletchable instanceof Arrow) {
422 AchievementHandler.activate(player, AchievementKey.FLETCHING);
423 }
424
425 if (iterations == amount || iterations > 28 || !(player.inventory.containsAll(fletchable.getIngredients()))) {
426 cancel();
427 if (!(player.inventory.containsAll(fletchable.getIngredients()))) {
428 player.send(new SendMessage("<col=369>You have run out of materials."));
429 }
430 return;
431 }
432 }
433
434
435 @Override
436 public String getName() {
437 return "Fletching";
438 }
439
440 @Override
441 public boolean prioritized() {
442 return false;
443 }
444
445 @Override
446 public WalkablePolicy getWalkablePolicy() {
448 }
449 };
450 }
451}
static final double FLETCHING_MODIFICATION
Definition Config.java:301
static void activate(Player player, AchievementKey achievement)
final DialogueFactory sendStatement(String... lines)
static String getName(int skill)
Definition Skill.java:502
Skill(int skill, int level, double experience)
Definition Skill.java:221
void addExperience(int id, double experience)
boolean removeAll(Collection<? extends Item > items)
static String getAOrAn(String nextWord)
Definition Utility.java:153