RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
Wintertodt.java
1package com.osroyale.content.wintertodt;
2
3import com.osroyale.Config;
4import com.osroyale.content.collectionlog.CollectionLog;
5import com.osroyale.content.collectionlog.CollectionLogData;
6import com.osroyale.content.skill.impl.woodcutting.AxeData;
7import com.osroyale.content.wintertodt.actions.*;
8import com.osroyale.game.task.Task;
9import com.osroyale.game.world.World;
10import com.osroyale.game.world.entity.combat.hit.Hit;
11import com.osroyale.game.world.entity.mob.Direction;
12import com.osroyale.game.world.entity.mob.UpdateFlag;
13import com.osroyale.game.world.entity.mob.npc.Npc;
14import com.osroyale.game.world.entity.mob.player.Player;
15import com.osroyale.game.world.entity.skill.Skill;
16import com.osroyale.game.world.items.Item;
17import com.osroyale.game.world.object.CustomGameObject;
18import com.osroyale.game.world.object.GameObject;
19import com.osroyale.game.world.position.Position;
20import com.osroyale.game.world.region.Region;
21import com.osroyale.net.packet.out.SendConfig;
22import com.osroyale.net.packet.out.SendRemoveObject;
23import com.osroyale.net.packet.out.SendString;
24import com.osroyale.util.Utility;
25
26import java.util.ArrayList;
27import java.util.Arrays;
28import java.util.List;
29import java.util.stream.Collectors;
30
67
68public class Wintertodt {
69
70 private static final int DEFAULT_DELAY = 10;
71
75 public static final int REGION_ID = 6462;
76
80 private static boolean started = false;
81 public static final int MAX_HP = 3500;
82 public static int health = 0;
83 private static int startDelay = DEFAULT_DELAY;
84 private static int pyroSpeechDelay;
85 public static Region region;
86
90 public static final int BRUMA_ROOT = 20695;
91 public static final int BRUMA_KINDLING = 20696;
92 public static final int REJUV_POT_UNF = 20697;
93 public static final int REJUV_POT_4 = 20699;
94 public static final int REJUV_POT_3 = 20700;
95 public static final int REJUV_POT_2 = 20701;
96 public static final int REJUV_POT_1 = 20702;
97 public static final int BRUMA_HERB = 20698;
98
102 private static final String[] PYROMANCER_DEAD_TEXT = {"My flame burns low.", "Mummy!", "I think I'm dying.", "We are doomed.", "Ugh, help me!"};
103
104 public static final int PYROMANCER = 7371;
105 public static final int INCAPACITATED_PYROMANCER = 7372;
106 private static final int FLAME = 7373;
107
111 private static final int SNOW_EFFECT_ID = 26690;
112 private static final int ACTIVE_STORM_ID = 29308;
113 private static final int INACTIVE_STORM_ID = 29309;
114 public static final int EMPTY_BRAZIER_ID = 29312;
115 public static final int BROKEN_BRAZIER_ID = 29313;
116 public static final int BURNING_BRAZIER_ID = 29314;
117 private static CustomGameObject WINTERTODT;
118
122 private static final List<Integer> GAME_ITEMS = Arrays.asList(BRUMA_ROOT, BRUMA_KINDLING, BRUMA_HERB, REJUV_POT_UNF, REJUV_POT_4, REJUV_POT_3, REJUV_POT_2, REJUV_POT_1);
123
127
128 private static final List<Integer> WARM_CLOTHING = Arrays.asList(
129 //Santa outfits
130 1050, 12887, 12888, 12889, 12890, 12891, 12892, 12893, 12894, 12895, 12896, 13343, 13344,
131 //Bunny outfit
132 23448, 13663, 13664, 13665, 13182,
133 //Clue hunter outfit
134 19689, 19691, 19693, 19695, 19697,
135 //Polar camo
136 10065, 10066,
137 //Wood camo
138 10053, 10055,
139 //Jungle camo
140 10057, 10059,
141 //Desert camo
142 10061, 10063,
143 //Larupia
144 10045, 10043, 10041,
145 //Graahk
146 10051, 10049, 10047,
147 //Kyatt
148 10039, 10037, 10035,
149 //Bomber
150 9945, 9944,
151 //Yakhide armour
152 10822, 10824,
153 //Pyromancer
154 20708, 20706, 20704, 20710,
155 //Chicken outfit
156 11021, 11020, 11022, 11019,
157 //Evil chicken
158 20439, 20436, 20442, 20434,
159 //Bearhead
160 4502,
161 //Fire tiara
162 5537,
163 //Lumberjack hat
164 10941,
165 //Firemaking hood
166 9806,
167 //Fire cape max hood
168 13330,
169 //Infernal max hood
170 21282,
171 //Scarfs
172 6857, 6859, 6861, 6863, 9470, 21314,
173 //Gloves of silence
174 10075,
175 //Fremennik gloves
176 3799,
177 //Warm gloves
178 20712,
179 //Firemaking cape
180 9804, 9805,
181 //Max cape
182 13280, 13329, 21284, 21285, 13337, 20760, 21898, 24855, 21776, 21780, 21778, 13331, 13333, 13335,
183 //Fire cape
184 6570,
185 //Obsidian cape
186 6568, 20050,
187 //Weapons
188 1387, 1393, 3053, 11787, 11998, 1401, 3054, 11789, 12000, 13241, 13242, 13243, 13244, 21031, 21033, 12773, 20056, 20720,
189 //Shields
190 20714, 20716, 7053
191 //TODO: Add the last few (https://i.imgur.com/Pif4I0l.png)
192 );
193
197 public static final Brazier[] BRAZIERS = {
198 new Brazier(World.getRegions().getRegion(new Position(1620, 3997, 0)).getGameObject(29312, new Position(1620, 3997, 0)), new Npc(7371, new Position(1619, 3996, 0), 0, Direction.NORTH_EAST), 2, 2, Direction.NORTH_EAST), // sw
199 new Brazier(World.getRegions().getRegion(new Position(1620, 4015, 0)).getGameObject(29312, new Position(1620, 4015, 0)), new Npc(7371, new Position(1619, 4018, 0), 0, Direction.SOUTH_EAST), 2, 0, Direction.SOUTH_EAST), // nw
200 new Brazier(World.getRegions().getRegion(new Position(1638, 4015, 0)).getGameObject(29312, new Position(1638, 4015, 0)), new Npc(7371, new Position(1641, 4018, 0), 0, Direction.SOUTH_WEST), 0, 0, Direction.SOUTH_WEST), // ne
201 new Brazier(World.getRegions().getRegion(new Position(1638, 3997, 0)).getGameObject(29312, new Position(1638, 3997, 0)), new Npc(7371, new Position(1641, 3996, 0), 0, Direction.NORTH_WEST), 0, 2, Direction.NORTH_WEST) // se
202 };
203
204 public static boolean isActive() {
205 return startDelay <= 0;
206 }
207
208 public static void init() {
209 region = World.getRegions().getRegion(new Position(1627, 4004, 0));
210 pyroSpeechDelay = 8;
211 startDelay = DEFAULT_DELAY;
212 WINTERTODT = new CustomGameObject(INACTIVE_STORM_ID, new Position(1627, 4004, 0));
213 WINTERTODT.register();
214 started = false;
215
216 for(Brazier brazier : BRAZIERS)
217 brazier.getPyromancer().register();
218
219 World.schedule(new Task(1) {
220 @Override
221 protected void execute() {
222 if(startDelay > 0)
223 startDelay--;
224
225 if(startDelay <= 0 && !started) start();
226
227 update();
228 }
229 });
230
231 World.schedule(new Task(2) {
232 @Override
233 protected void execute() {
234 if(!isActive()) return;
235
236 pyroSpeechDelay--;
237 applyColdDamage();
238 extinguishBraziers();
239 doMagicAttack();
240 attackPyromancers();
241 pyromancerText();
242 dealDamage();
243 }
244 });
245 }
246
247 private static void start() {
248 WINTERTODT.transform(ACTIVE_STORM_ID);
249
250 for (Brazier brazier : BRAZIERS) {
251 //brazier.getObject().transform(EMPTY_BRAZIER_ID);
252 brazier.getObject().unregister();
253 brazier.setObject(EMPTY_BRAZIER_ID);
254 brazier.getObject().register();
255 if (!brazier.isPyromancerAlive())
256 brazier.getPyromancer().transform(PYROMANCER);
257 }
258
259 health = MAX_HP;
260 started = true;
261 update();
262 }
263
264 private static void update() {
265 region.getPlayers(0).forEach(Wintertodt::send);
266 }
267
268 public static void send(Player player) {
269 player.send(new SendString("Wintertodt's Energy: "+(health / (MAX_HP / 100))+"%", 41553));
270 player.send(new SendString(isActive() ? "" : "The Wintertodt returns in: " + ((startDelay * 600) / 1000) + " secs", 41554));
271 player.send(new SendString("<col="+(player.wintertodtPoints >= 500 ? "FFFFFF" : "FF0000")+">Points\\n" + player.wintertodtPoints, 41556));
272
273 //Sends the pyromancer config stuff
274 player.send(new SendConfig(2224, BRAZIERS[0].isPyromancerAlive() ? 0 : 1));
275 player.send(new SendConfig(2222, BRAZIERS[1].isPyromancerAlive() ? 0 : 1));
276 player.send(new SendConfig(2223, BRAZIERS[2].isPyromancerAlive() ? 0 : 1));
277 player.send(new SendConfig(2225, BRAZIERS[3].isPyromancerAlive() ? 0 : 1));
278 //Sends the brazier config stuff
279 player.send(new SendConfig(2228, BRAZIERS[0].getBrazierState()));
280 player.send(new SendConfig(2226, BRAZIERS[1].getBrazierState()));
281 player.send(new SendConfig(2227, BRAZIERS[2].getBrazierState()));
282 player.send(new SendConfig(2229, BRAZIERS[3].getBrazierState()));
283
284 if (player.interfaceManager.getWalkable() != 41550)
285 player.interfaceManager.openWalkable(41550);
286 }
287
288 private static void applyColdDamage() {
289 region.getPlayers(0).forEach(player -> {
290 if(player.getPosition().getY() <= 3987 || Utility.random(25) != 0) return;
291
292 player.damage(new Hit(getColdDamage(player)));
293 player.message("The cold of the Wintertodt seeps into your bones.");
294
295 if(player.action.getCurrentAction() instanceof WintertodtAction)
296 player.action.getCurrentAction().cancel();
297 });
298 }
299
303 private static void extinguishBraziers() {
304 for (Brazier brazier : BRAZIERS) {
305 int roll = Utility.random(health + 1500) / 10;
306 if(brazier.getObject().getId() == BURNING_BRAZIER_ID && roll == 10) {
307 if(brazier.hasSnowStorm()) continue;
308
309 if(Utility.random(health < (MAX_HP / 2) ? 2 : 3) == 1)
310 breakBrazier(brazier);
311 else {
312 //Graphic (502, 115, 0)
313 //brazier.getObject().transform(EMPTY_BRAZIER_ID);
314 brazier.getObject().unregister();
315 brazier.setObject(EMPTY_BRAZIER_ID);
316 brazier.getObject().register();
317 }
318 }
319 }
320 }
321
325 private static void breakBrazier(Brazier brazier) {
326 if(brazier.getObject().getId() == BROKEN_BRAZIER_ID) return;
327
328 List<GameObject> objects = Arrays.asList(
329 new CustomGameObject(SNOW_EFFECT_ID, new Position(brazier.getObject().getPosition().getX() + 1, brazier.getObject().getPosition().getY(), 0)),
330 new CustomGameObject(SNOW_EFFECT_ID, new Position(brazier.getObject().getPosition().getX(), brazier.getObject().getPosition().getY() + 1, 0)),
331 new CustomGameObject(SNOW_EFFECT_ID, new Position(brazier.getObject().getPosition().getX() + 1, brazier.getObject().getPosition().getY() + 1, 0)),
332 new CustomGameObject(SNOW_EFFECT_ID, new Position(brazier.getObject().getPosition().getX() + 2, brazier.getObject().getPosition().getY() + 1, 0)),
333 new CustomGameObject(SNOW_EFFECT_ID, new Position(brazier.getObject().getPosition().getX() + 1, brazier.getObject().getPosition().getY() + 2, 0))
334 );
335
336 for(GameObject gameObject : objects)
337 gameObject.register();
338
339 brazier.setSnowStorm(true);
340
341 World.schedule(new Task(4) {
342 @Override
343 public void execute() {
344
345 for(GameObject gameObject : objects) {
346 gameObject.unregister();
347 region.getPlayers(0).forEach(players -> {
348 players.send(new SendRemoveObject(new CustomGameObject(gameObject.getId(), gameObject.getPosition())));
349 });
350 }
351
352 brazier.setSnowStorm(false);
353
354 if(isActive()) {
355 //Graphio (502, 90, 0)
356 //brazier.getObject().transform(BROKEN_BRAZIER_ID);
357 brazier.getObject().unregister();
358 brazier.setObject(Wintertodt.BROKEN_BRAZIER_ID);
359 brazier.getObject().register();
360 region.getPlayers(0).forEach(player -> {
361 if(Utility.goodDistance(brazier.getObject().getPosition().getX() + 1, brazier.getObject().getPosition().getY() + 1, player.getPosition().getX(), player.getPosition().getY(), 2)) {
362 player.message("The brazier is broken and shrapnel damages you.");
363 player.damage(new Hit(Utility.random(getBrazierAttackDamage(player))));
364 }
365 });
366 }
367 this.cancel();
368 }
369 });
370 }
371
375 public static int getBrazierAttackDamage(Player player) {
376 return (int) ((10.0 - getWarmItemsWorn(player)) * (Skill.getLevelForExperience(player.skills.get(Skill.HITPOINTS).getExperience()) + 1) / Skill.getLevelForExperience(player.skills.get(Skill.FIREMAKING).getExperience())) * 2;
377 }
378
382 private static void doMagicAttack() {
383 if(Utility.random(25) != 1 || region.getPlayers(0).size() == 0) return;
384
385 Player player = region.getPlayers(0).toArray(new Player[0])[Utility.random(region.getPlayers(0).size())];
386 if (player.getPosition().getY() <= 3987) return;
387
388 int baseX = player.getPosition().getX();
389 int baseY = player.getPosition().getY();
390 List<GameObject> snowAttacks = new ArrayList<>();
391
392 snowAttacks.add(new CustomGameObject(SNOW_EFFECT_ID, new Position(baseX, baseY, 0)));
393 if(region.getObjects(new Position(baseX + 1, baseY + 1, 0)).size() == 0)
394 snowAttacks.add(new CustomGameObject(SNOW_EFFECT_ID, new Position(baseX + 1, baseY + 1, 0)));
395 if(region.getObjects(new Position(baseX + 1, baseY - 1, 0)).size() == 0)
396 snowAttacks.add(new CustomGameObject(SNOW_EFFECT_ID, new Position(baseX + 1, baseY - 1, 0)));
397 if(region.getObjects(new Position(baseX - 1, baseY + 1, 0)).size() == 0)
398 snowAttacks.add(new CustomGameObject(SNOW_EFFECT_ID, new Position(baseX - 1, baseY + 1, 0)));
399 if(region.getObjects(new Position(baseX - 1, baseY - 1, 0)).size() == 0)
400 snowAttacks.add(new CustomGameObject(SNOW_EFFECT_ID, new Position(baseX - 1, baseY - 1, 0)));
401
402 for(GameObject gameObject : snowAttacks)
403 gameObject.register();
404
405 World.schedule(new Task(4) {
406 int index = 0;
407 @Override
408 public void execute() {
409 for(GameObject gameObject : snowAttacks) {
410 gameObject.transform(index == 0 ? 29325 : 29324);
411 index++;
412 }
413
414 region.getPlayers(0).forEach(players -> {
415 if(Utility.goodDistance(baseX, baseY, players.getX(), player.getY(), 1)) {
416 players.message("The freezing cold attack of the Wintertodt's magic hits you.");
417 players.damage(new Hit(1 + (getAreaAttackDamage(players) - 1)));
418 }
419 });
420 this.cancel();
421 }
422 });
423
424 World.schedule(new Task(14) {
425 @Override
426 public void execute() {
427 for(GameObject gameObject : snowAttacks) {
428 gameObject.unregister();
429 region.getPlayers(0).forEach(players -> {
430 players.send(new SendRemoveObject(new CustomGameObject(gameObject.getId(), gameObject.getPosition())));
431 });
432 }
433 this.cancel();
434 }
435 });
436 }
437
441 public static int getAreaAttackDamage(Player player) {
442 return (int) ((10.0 - getWarmItemsWorn(player)) * (Skill.getLevelForExperience(player.skills.get(Skill.HITPOINTS).getExperience()) + 1) / Skill.getLevelForExperience(player.skills.get(Skill.FIREMAKING).getExperience()) * 3);
443 }
444
448 private static void attackPyromancers() {
449 List<Npc> pyros = Arrays.stream(BRAZIERS).filter(Brazier::isPyromancerAlive).map(Brazier::getPyromancer).collect(Collectors.toList());
450 if (!pyros.isEmpty() && Utility.random(pyros.size() * 30) == pyros.size()) {
451 Npc pyro = pyros.get(Utility.random(pyros.size()));
452 if(pyro.pyroHealth <= 0) return;
453
454 if(pyro.pyroSnowAttack) {
455 System.out.println("already a snow attack going for this pyro...");
456 return;
457 }
458
459 pyro.pyroSnowAttack = true;
460 GameObject snow = new CustomGameObject(SNOW_EFFECT_ID, pyro.getPosition());
461 snow.register();
462
463 World.schedule(new Task(4) {
464 @Override
465 public void execute() {
466 int damage = 6 + Utility.random(4);
467 if(damage > pyro.pyroHealth)
468 damage = pyro.pyroHealth;
469 pyro.pyroHealth -= damage;
470 pyro.writeFakeDamage(new Hit(damage));
471 if(pyro.pyroHealth <= 0) {
472 pyro.pyroHealth = 0;
473 pyro.transform(INCAPACITATED_PYROMANCER);
474 }
475 pyro.pyroSnowAttack = false;
476 region.getPlayers(0).forEach(players -> {
477 players.send(new SendRemoveObject(new CustomGameObject(snow.getId(), snow.getPosition())));
478 });
479 snow.unregister();
480 this.cancel();
481 }
482 });
483 }
484 }
485
489 private static void pyromancerText() {
490 if(pyroSpeechDelay <= 0) {
491 pyroSpeechDelay = 8;
492 for (Brazier brazier : BRAZIERS) {
493 if (!brazier.isPyromancerAlive())
494 brazier.getPyromancer().speak(PYROMANCER_DEAD_TEXT[Utility.random(PYROMANCER_DEAD_TEXT.length - 1)]);
495 else if (brazier.getObject().getId() == EMPTY_BRAZIER_ID)
496 brazier.getPyromancer().speak("Light this brazier!");
497 else if (brazier.getObject().getId() == BROKEN_BRAZIER_ID)
498 brazier.getPyromancer().speak("Fix this brazier!");
499 else if (Utility.random(4) == 1)
500 brazier.getPyromancer().speak("Yemalo shi cardito!");
501
502 if (brazier.isPyromancerAlive() && brazier.getObject().getId() == BURNING_BRAZIER_ID && Utility.random(3) == 1)
503 brazier.getPyromancer().animate(4432);
504 }
505 }
506 }
507
511 private static void dealDamage() {
512 int damage = 0;
513 for (Brazier brazier : BRAZIERS) {
514 if (brazier.isPyromancerAlive() && brazier.getObject().getId() == BURNING_BRAZIER_ID) {
515 shootFlame(brazier);
516 damage += 5;
517 }
518 }
519
520 if (damage > 0) {
521 health -= damage;
522 if (health <= 0) {
523 health = 0;
524 death();
525 }
526 } else
527 health = Math.min(MAX_HP, health + 5);
528 }
529
533 public static void shootFlame(Brazier brazier) {
534 Npc flame = new Npc(FLAME, new Position(brazier.getObject().getPosition().getX() + brazier.getFlameOffsetX(), brazier.getObject().getPosition().getY() + brazier.getFlameOffsetY(), brazier.getObject().getPosition().getHeight()), 0, brazier.direction);
535 flame.movement.simplePath(new Position(1630, 4007));
536 flame.register();
537 flame.action.execute(new FlameWalk(flame));
538 }
539
543 private static void death() {
544 started = false;
545 startDelay = DEFAULT_DELAY;
546
547 WINTERTODT.transform(INACTIVE_STORM_ID);
548
549 for (Brazier brazier : BRAZIERS) {
550 brazier.getPyromancer().speak("We can rest for a time.");
551 brazier.getPyromancer().transform(PYROMANCER);
552 brazier.getPyromancer().pyroSnowAttack = false;
553 brazier.getPyromancer().pyroHealth = 24;
554 brazier.getPyromancer().animate(65535);
555 //brazier.getObject().transform(EMPTY_BRAZIER_ID);
556 brazier.getObject().unregister();
557 brazier.setObject(EMPTY_BRAZIER_ID);
558 brazier.getObject().register();
559
560 }
561 region.getPlayers(0).forEach(Wintertodt::award);
562 }
563
567 private static void award(Player player) {
568 removeGameItems(player);
569
570 if (player.wintertodtPoints >= 500) {
571 CollectionLog.increaseCounter(player, CollectionLogData.WINTERTODT);
573 int crates = player.wintertodtPoints / 500;
574 if (crates > 1)
575 player.message("You have gained " + crates + " supply crates!");
576 else
577 player.message("You have gained a supply crate!");
578 player.inventory.add(new Item(20703, crates));
579 player.inventory.refresh();
580 } else player.message("You did not earn enough points to be worthy of a gift from the citizens of Kourend this time.");
581
582 player.wintertodtPoints = 0;
583 }
584
588 public static void removeGameItems(Player player) {
589 int slot = 0;
590 for (Item item : player.inventory.getItems()) {
591 if (item != null && GAME_ITEMS.contains(item.getId())) {
592 player.inventory.set(slot, null, false);
593 }
594 slot++;
595 }
596 player.inventory.refresh();
597 }
598
602 public static int getColdDamage(Player player) {
603 return (int) ((16.0 - getWarmItemsWorn(player) - (2 * getBraziersLit())) * (Skill.getLevelForExperience(player.skills.get(Skill.HITPOINTS).getExperience()) + 1) / Skill.getLevelForExperience(player.skills.get(Skill.FIREMAKING).getExperience()));
604 }
605
609 public static int getWarmItemsWorn(Player player) {
610 int warmClothing = 0;
611 for(int id : WARM_CLOTHING) {
612 if(player.equipment.contains(id)) warmClothing++;
613 if(warmClothing >= 4) break;
614 }
615 return warmClothing;
616 }
617
621 public static int getBraziersLit() {
622 int count = 0;
623 for (Brazier b : BRAZIERS)
624 if (b.getObject().getId() == BURNING_BRAZIER_ID)
625 count++;
626 return Math.min(count, 3);
627 }
628
632 public static void chopRoot(Player player) {
633 if(!isActive()) {
634 player.message("There's no need to do that at this time.");
635 return;
636 }
637
638 AxeData axeData = AxeData.getDefinition(player).orElse(null);
639
640 if(axeData == null) {
641 player.message("You do not have an axe which you have the woodcutting level to use.");
642 return;
643 }
644
645 if(player.inventory.getFreeSlots() <= 0) {
646 player.message("You have no space for that.");
647 return;
648 }
649
650 player.action.execute(new ChopRoots(player));
651 }
652
656 public static void feedBrazier(Player player, GameObject gameObject) {
657 if(!isActive()) {
658 player.message("There's no need to do that at this time.");
659 return;
660 }
661
662 Brazier brazier = null;
663
664 for(Brazier b : BRAZIERS) {
665 if(b.getObject().getId() == gameObject.getId() && b.getObject().getPosition() == gameObject.getPosition()) {
666 brazier = b;
667 break;
668 }
669 }
670
671 if(brazier == null) {
672 System.out.println("Brazier has not been found...");
673 return;
674 }
675
676 player.animate(832);
677 player.action.execute(new FeedBrazier(player, brazier));
678 }
679
683 public static void fixBrazier(Player player, GameObject gameObject) {
684 if(!isActive()) {
685 player.message("There's no need to do that at this time.");
686 return;
687 }
688
689 Brazier brazier = null;
690
691 for(Brazier b : BRAZIERS) {
692 if(b.getObject().getId() == gameObject.getId() && b.getObject().getPosition() == gameObject.getPosition()) {
693 brazier = b;
694 break;
695 }
696 }
697
698 if(brazier == null) {
699 System.out.println("Brazier has not been found...");
700 return;
701 }
702
703 if(!brazier.isPyromancerAlive()) {
704 player.message("Heal the Pyromancer before fixing the brazier.");
705 return;
706 }
707
708 if(!player.inventory.contains(2347)) {
709 player.message("You need a hammer to fix this brazier.");
710 return;
711 }
712
713 player.animate(3676);
714 player.action.execute(new FixBrazier(player, brazier));
715 }
716
720 public static void fletch(Player player) {
721 if(!isActive()) {
722 player.message("There's no need to do that at this time.");
723 return;
724 }
725
726 if(!player.inventory.contains(BRUMA_ROOT)) return;
727
728 player.animate(1248);
729 player.action.execute(new FletchKindling(player, player.inventory.computeAmountForId(BRUMA_ROOT)));
730 }
731
735 public static void lightBrazier(Player player, GameObject gameObject) {
736 if(!isActive()) {
737 player.message("There's no need to do that at this time.");
738 return;
739 }
740
741 Brazier brazier = null;
742
743 for(Brazier b : BRAZIERS) {
744 if(b.getObject().getId() == gameObject.getId() && b.getObject().getPosition() == gameObject.getPosition()) {
745 brazier = b;
746 break;
747 }
748 }
749
750 if(brazier == null) {
751 System.out.println("Brazier has not been found...");
752 return;
753 }
754
755 if(!brazier.isPyromancerAlive()) {
756 player.message("Heal the Pyromancer before lighting the brazier.");
757 return;
758 }
759
760 if(!player.inventory.contains(590) && !player.equipment.contains(20720)) {
761 player.message("You need a tinderbox or Bruma Torch to light that brazier.");
762 return;
763 }
764
765 player.animate(733);
766 player.action.execute(new LightBrazier(player, brazier));
767 }
768
772 public static void mixHerb(Player player) {
773 if(!isActive()) {
774 player.message("There's no need to do that at this time.");
775 return;
776 }
777
778 int herbs = player.inventory.computeAmountForId(BRUMA_HERB);
779 int pots = player.inventory.computeAmountForId(REJUV_POT_UNF);
780 int min = Utility.min(herbs, pots);
781
782 if(min == 0) return;
783
784 player.animate(363);
785 player.action.execute(new MixHerb(player, min));
786 }
787
791 public static void takeHerb(Player player) {
792 if(!isActive()) {
793 player.message("There's no need to do that at this time.");
794 return;
795 }
796
797 if(player.inventory.getFreeSlots() <= 0) {
798 player.message("You have no space for that.");
799 return;
800 }
801
802 player.animate(2282);
803 player.action.execute(new PickHerb(player));
804 }
805
809 public static void healPyromancer(Player player, Npc npc, int slot) {
810 if(!isActive()) {
811 player.message("There's no need to do that at this time.");
812 return;
813 }
814
815 Brazier brazier = null;
816
817 for(Brazier b : BRAZIERS) {
818 if(b.getPyromancer().getPosition() == npc.getPosition() && b.getPyromancer().id == npc.id) {
819 brazier = b;
820 break;
821 }
822 }
823
824 if(brazier == null) {
825 System.out.println("Brazier has not been found...");
826 return;
827 }
828
829 Item itemUsed = player.inventory.get(slot);
830
831 if(itemUsed.getId() != REJUV_POT_4 && itemUsed.getId() != REJUV_POT_3 && itemUsed.getId() != REJUV_POT_2 && itemUsed.getId() != REJUV_POT_1) {
832 System.out.println("not a rejuv potion");
833 return;
834 }
835
836 Item newPot = new Item(player.inventory.getId(slot) + 1);
837 if(newPot.getId() > REJUV_POT_1) newPot = null;
838
839 player.inventory.set(slot, newPot, true);
840
841 brazier.getPyromancer().transform(PYROMANCER);
842 brazier.getPyromancer().pyroHealth = 24;
843 brazier.getPyromancer().pyroSnowAttack = false;
844
845 addPoints(player, 30);
846 }
847
851 public static void addPoints(Player player, int amount) {
852 int old = player.wintertodtPoints;
853 player.wintertodtPoints += amount;
854 if (old < 500 && player.wintertodtPoints >= 500) {
855 player.message("You have helped enough to earn a supply crate. Further work will go towards better rewards.");
856 }
857 send(player);
858 }
859}
static final double FIREMAKING_MODIFICATION
Definition Config.java:298
static int getBrazierAttackDamage(Player player)
static void removeGameItems(Player player)
static int getWarmItemsWorn(Player player)
static void lightBrazier(Player player, GameObject gameObject)
static void healPyromancer(Player player, Npc npc, int slot)
static void shootFlame(Brazier brazier)
static void feedBrazier(Player player, GameObject gameObject)
static int getColdDamage(Player player)
static int getAreaAttackDamage(Player player)
static void fixBrazier(Player player, GameObject gameObject)
static void addPoints(Player player, int amount)
static void schedule(Task task)
Definition World.java:284
void speak(String forceChat)
Definition Mob.java:164
static final byte getLevelForExperience(double experience)
Definition Skill.java:483
void addExperience(int id, double experience)
Collection< Player > getPlayers(int height)
Definition Region.java:142
static Optional< AxeData > getDefinition(Player player)
Definition AxeData.java:111