107public class PlayerAssistant {
110 private final Player player;
113 private Map<Integer, TinterfaceText> interfaceText =
new HashMap<>();
116 PlayerAssistant(
Player player) {
117 this.player = player;
134 player.runePouch.refresh();
138 private void setEffects() {
139 if (player.getPoisonImmunity().get() > 0) {
142 if (player.skulling.getSkullRemoveTask().getSkullTime() > 0) {
143 player.skulling.skull();
146 if (player.teleblockTimer.get() > 0) {
154 private void initialize() {
155 player.
getCombat().resetTimers(-CombatConstants.COMBAT_LOGOUT_COOLDOWN);
158 InterfaceWriter.write(
new InformationWriter(player));
159 InterfaceWriter.write(
new AchievementWriter(player));
169 player.getCombat().tick();
170 Activity.forActivity(player, it -> {
177 if (player.sequence % 20 == 0) {
184 if (player.isSingleCast())
185 return new PlayerMagicStrategy(player.getSingleCastSpell());
186 if (player.isAutocast())
187 return new PlayerMagicStrategy(player.getAutocastSpell());
188 if (player.isSpecialActivated()) {
189 if (player.getCombatSpecial() ==
null) {
190 player.setSpecialActivated(
false);
193 return player.getCombatSpecial().getStrategy();
196 Item item = player.equipment.get(
Equipment.WEAPON_SLOT);
198 if(item.getId() == 22325) {
199 return ScytheOfViturStrategy.get();
201 if (item.getId() == 11907) {
202 return TridentOfTheSeasStrategy.get();
204 if (item.getId() == 27275) {
205 return TumekenStrategy.get();
208 if (item.getId() == 12899) {
209 return TridentOfTheSwampStrategy.get();
212 if (item.getId() == 12926) {
213 return ToxicBlowpipeStrategy.get();
216 if (item.getRangedDefinition().isPresent()) {
217 return PlayerRangedStrategy.get();
220 return PlayerMeleeStrategy.get();
224 private void updateSpecial() {
225 if (player.getSpecialPercentage().get() < 100 && player.sequence % 60 == 0)
238 player.interfaceManager.setSidebar(
Config.MAGIC_TAB, disabled ? -1 : player.spellbook.getInterfaceId());
240 WeaponInterface.execute(player, player.equipment.getWeapon(),
login);
246 private void setAttribute() {
247 player.attributes.set(
"OBELISK", -1);
248 player.attributes.set(
"BANK_KEY",
false);
249 player.attributes.set(
"TRADE_KEY",
false);
250 player.attributes.set(
"DUEL_KEY",
false);
251 player.attributes.set(
"RUN_FLAG_KEY", 10);
252 player.attributes.set(
"PLAYER_TITLE_KEY", 0);
253 player.attributes.set(
"FORCE_MOVEMENT",
false);
254 player.attributes.set(
"PRELOADING_SLOT_KEY", 0);
255 player.attributes.set(
"PERSONAL_STORE_KEY",
null);
256 player.attributes.set(
"PRICE_CHECKER_KEY",
false);
257 player.attributes.set(
"DONATOR_DEPOSIT_KEY",
false);
258 player.attributes.set(
"TELEPORT_TYPE_KEY", TeleportType.FAVORITES);
262 private void setActivity() {
264 if (player.punishment.isJailed()) {
265 JailActivity.create(player);
266 }
else if (player.needsStarter) {
267 StarterKit.open(player);
268 }
else if (
Area.inGodwars(player)) {
269 GodwarsActivity.create(player);
270 }
else if (
Area.inWarriorGuild(player)) {
271 WarriorGuild.create(player);
272 }
else if (Area.inBarrows(player)) {
273 Barrows.create(player);
274 }
else if (Area.inVorkath(player)) {
275 VorkathActivity.create(player);
276 }
else if (Area.inKraken(player)) {
277 KrakenActivity.create(player);
278 }
else if (Area.inCerberus(player)) {
279 CerberusActivity.create(player);
280 }
else if (Area.inWilderness(player)) {
281 player.valueIcon = getValueIcon(player).getCode();
282 player.updateFlags.add(UpdateFlag.APPEARANCE);
287 private void setContextMenu() {
288 if (Area.inDuelArenaLobby(player)) {
289 player.send(
new SendPlayerOption(PlayerOption.DUEL_REQUEST,
false));
290 player.send(
new SendPlayerOption(PlayerOption.ATTACK,
false,
true));
294 }
else if (Area.inDuelArena(player) || Area.inDuelObsticleArena(player)) {
295 player.send(
new SendPlayerOption(PlayerOption.ATTACK,
true));
296 player.send(
new SendPlayerOption(PlayerOption.DUEL_REQUEST,
false,
true));
298 player.send(
new SendPlayerOption(PlayerOption.ATTACK,
false,
true));
299 player.send(
new SendPlayerOption(PlayerOption.DUEL_REQUEST,
false,
true));
301 player.send(
new SendPlayerOption(PlayerOption.FOLLOW,
false));
302 player.send(
new SendPlayerOption(PlayerOption.TRADE_REQUEST,
false));
303 player.send(
new SendPlayerOption(PlayerOption.VIEW_PROFILE,
false));
308 Consumer<Prayer> enable = prayer -> {
310 player.getCombat().addListener(PrayerListener.get());
312 player.send(
new SendConfig(prayer.getConfig(), 1));
313 prayer.getListener().ifPresent(listener -> player.getCombat().addListener(listener));
315 Consumer<Prayer> disable = prayer -> {
316 if (prayer ==
Prayer.RETRIBUTION || prayer ==
Prayer.REDEMPTION || prayer ==
Prayer.SMITE) {
317 player.getCombat().removeListener(PrayerListener.get());
319 player.send(
new SendConfig(prayer.getConfig(), 0));
320 prayer.getListener().ifPresent(listener -> player.getCombat().removeListener(listener));
322 Consumer<Prayer> overhead = prayer -> {
323 player.headIcon = prayer.getHeadIcon();
324 player.updateFlags.add(
UpdateFlag.APPEARANCE);
326 Consumer<Prayer> noOverhead = prayer -> {
327 player.headIcon = -1;
328 player.updateFlags.add(
UpdateFlag.APPEARANCE);
330 player.prayer.setOnChange(enable, disable, overhead, noOverhead);
331 Consumer<Prayer> qEnable = prayer -> player.send(
new SendConfig(prayer.getQConfig(), 0));
332 Consumer<Prayer> qDisable = prayer -> player.send(
new SendConfig(prayer.getQConfig(), 1));
333 player.quickPrayers.setOnChange(qEnable, qDisable,
null,
null);
334 Arrays.stream(
Prayer.values()).forEach(prayer -> {
335 disable.accept(prayer);
337 if (player.quickPrayers.isActive(prayer)) {
338 qEnable.accept(prayer);
340 qDisable.accept(prayer);
348 player.runEnergy = 100;
349 player.skulling.unskull();
350 player.skills.restoreAll();
351 player.inventory.refresh();
352 player.equipment.login();
353 player.action.reset();
354 player.interfaceManager.close();
355 player.setSpecialActivated(
false);
357 player.getCombat().getDamageCache().clear();
359 player.movement.reset();
360 player.teleblockTimer.set(0);
361 player.spellCasting.castingDelay.reset();
362 player.spellCasting.vengeanceDelay.reset();
365 player.venged =
false;
378 player.movement.reset();
379 player.getCombat().reset();
380 player.prayer.reset();
381 player.headIcon = -1;
382 player.updateFlags.add(
UpdateFlag.APPEARANCE);
395 for (WidgetType widget : WidgetType.values()) {
402 if (player.movement.isRunning() && player.movement.isMoving() && !player.isBot && !
PlayerRight.
isDeveloper(player)) {
404 if (player.runEnergy < 0)
405 player.runEnergy = 0;
406 if (player.runEnergy == 0)
407 player.movement.setRunningToggled(
false);
413 private void runRestore() {
414 if (player.resting && player.sequence % 50 == 0) {
417 if (player.runEnergy < 100) {
418 int rate = player.energyRate > 0 ? 2 : player.resting || SkillCape.isEquipped(player, SkillCape.AGILITY) ? 3 : 4;
419 if (player.sequence % rate == 0) {
424 if (player.energyRate > 0) {
429 public void activateSkilling(
int amount) {
431 player.skillingPoints += amount;
432 player.message(
"<col=D4379A>You have earned " + amount +
" skilling point" + (amount > 1 ?
"" :
"s") +
". You now have a total of " +
Utility.
formatDigits(player.skillingPoints) +
".");
437 private void skillRestore() {
438 if (player.sequence % 120 != 0 && player.sequence % 50 != 0)
440 if (player.sequence % (SkillCape.isEquipped(player, SkillCape.HITPOINTS) ? 50 : 100) == 0) {
441 player.skills.regress(Skill.HITPOINTS);
442 }
else if (player.sequence % 50 == 0 && player.prayer.isActive(Prayer.RAPID_HEAL)) {
443 player.skills.regress(Skill.HITPOINTS);
445 for (
int index = 0; index <= 6; index++) {
446 if (index == Skill.HITPOINTS || index == Skill.PRAYER)
continue;
448 Skill skill = player.skills.get(index);
449 if (skill.
getLevel() < skill.
getMaxLevel() && player.prayer.isActive(Prayer.RAPID_RESTORE))
453 if (player.sequence % amount == 0)
454 player.skills.regress(index);
459 private void prayerDrain() {
460 if (!player.prayer.isActive()) {
463 int bonus = player.getBonus(Equipment.PRAYER_BONUS);
464 int rate = player.prayer.drainAmount(bonus);
468 public void drainPrayer(
int amount) {
470 Skill skill = player.skills.get(Skill.PRAYER);
472 player.skills.refresh(Skill.PRAYER);
475 player.send(
new SendMessage(
"You have run out of prayer points; you must recharge at an altar."));
476 player.prayer.reset();
477 player.getPlayer().send(
new SendConfig(659, 0));
482 public void claimIronmanArmour() {
483 if (player.right == PlayerRight.IRONMAN) {
484 player.inventory.addOrDrop(
new Item(12810),
new Item(12811),
new Item(12812));
485 }
else if (player.right == PlayerRight.ULTIMATE_IRONMAN) {
486 player.inventory.addOrDrop(
new Item(12813),
new Item(12814),
new Item(12815));
487 }
else if (player.right == PlayerRight.HARDCORE_IRONMAN) {
488 player.inventory.addOrDrop(
new Item(20792),
new Item(20794),
new Item(20796));
491 player.message(
"You must be an ironman to claim this armour.");
497 Item[] inventory = other.inventory.
toArray();
498 Item[] equipment = other.equipment.
toArray();
499 player.inventory.clear(
false);
500 player.equipment.clear(
false);
501 player.inventory.addAll(inventory);
502 player.equipment.manualWearAll(equipment);
503 player.inventory.refresh();
504 player.equipment.login();
510 player.mobAnimation.reset();
516 player.mobAnimation.setStand(def.
getStand());
517 player.mobAnimation.setWalk(def.
getWalk());
518 player.mobAnimation.setTurn180(def.
getTurn180());
519 player.mobAnimation.setTurn90CW(def.
getTurn90CW());
521 player.setWidth(def.
getSize());
522 player.setLength(def.
getSize());
526 player.updateFlags.add(
UpdateFlag.APPEARANCE);
530 void welcomeScreen() {
531 player.setVisible(
true);
583 player.send(
new SendString(
"Are you sure you want to destroy this item?", 14174));
587 player.send(
new SendString(
"Doing this action is permanent!", 14182));
589 player.send(
new SendString(item.getName(), 14184));
591 player.attributes.set(
"DESTROY_ITEM_KEY", slot);
596 if (player.attributes.has(
"UNCHARGE_HELM_KEY")) {
597 Item item = player.attributes.get(
"UNCHARGE_HELM_KEY");
598 player.dialogueFactory.clear();
599 player.inventory.replace(item,
new Item(12_934, 20_000),
true);
600 player.send(
new SendMessage(
"You have dismantled your " + item.getName() +
"."));
601 player.attributes.remove(
"UNCHARGE_HELM_KEY");
605 if (player.attributes.has(
"RESTORE_HELM_KEY")) {
606 Item item = player.attributes.get(
"RESTORE_HELM_KEY");
607 player.dialogueFactory.clear();
608 if (item.matchesId(13_197)) {
609 player.serpentineHelmCharges += player.tanzaniteHelmCharges;
610 player.tanzaniteHelmCharges = 0;
611 if (player.serpentineHelmCharges > 11_000) {
612 player.inventory.addOrDrop(
new Item(12934, player.serpentineHelmCharges - 11_000));
613 player.serpentineHelmCharges = 11_000;
615 player.inventory.replace(item,
new Item(player.serpentineHelmCharges <= 0 ? 12_929 : 12_931),
true);
616 }
else if (item.matchesId(13_199)) {
617 player.serpentineHelmCharges += player.magmaHelmCharges;
618 player.magmaHelmCharges = 0;
619 if (player.serpentineHelmCharges > 11_000) {
620 player.inventory.addOrDrop(
new Item(12934, player.serpentineHelmCharges - 11_000));
621 player.serpentineHelmCharges = 11_000;
624 player.inventory.replace(item,
new Item(player.serpentineHelmCharges <= 0 ? 12_929 : 12_931),
true);
625 player.send(
new SendMessage(
"You have restored your " + item.getName() +
"."));
626 player.attributes.remove(
"RESTORE_HELM_KEY");
630 int index = player.attributes.get(
"DESTROY_ITEM_KEY", Integer.class);
633 Item item = player.inventory.get(index);
636 player.dialogueFactory.clear();
637 player.inventory.remove(item, index);
638 player.send(
new SendMessage(
"You have destroyed your " + item.getName() +
"."));
639 player.attributes.remove(
"DESTROY_ITEM_KEY");
642 public boolean contains(Item item) {
643 return player.inventory.contains(item) || player.equipment.contains(item) || player.bank.contains(item);
648 double KDR = (player.kill / (double) player.death);
649 return Double.isNaN(KDR) ?
"0.0" : String.format(
"%.2f", KDR);
654 player.getCombat().addFirst(player.getStrategy());
655 int max =
FormulaFactory.getModifiedMaxHit(player, defender, type);
656 player.getCombat().removeFirst();
662 return player.getIndex() << 2;
669 if (player.skills.getMaxLevel(index) == 99)
675 public long networth() {
676 return networth(player.inventory, player.equipment, player.bank);
690 double weight = player.inventory.getWeight();
691 weight += player.equipment.getWeight();
697 long carrying = networth(player.inventory, player.equipment);
699 if (carrying < 500_000)
701 if (carrying > 500_000 && carrying < 1_500_000)
703 if (carrying > 1_500_000 && carrying < 5_000_000)
705 if (carrying > 5_000_000 && carrying < 25_000_000)
707 if (carrying > 25_000_000)
713 public void setValueIcon() {
714 ValueIcon icon = getValueIcon(player);
716 final int currentIcon = player.valueIcon;
718 if (icon.getCode() == currentIcon) {
722 player.valueIcon = icon.getCode();
723 player.updateFlags.add(
UpdateFlag.APPEARANCE);
726 String getCombatRange() {
732 return !player.interfaceManager.isMainClear() || player.isDead() || player.newPlayer ||
733 player.needsStarter || player.locking.locked() || player.inActivity(
ActivityType.DUEL_ARENA);
736 public void moveCamera(
Position position,
int resetDelay) {
737 player.send(
new SendCameraTurn(position.getChunkX(), position.getChunkY(), position.getHeight(), 5, 5));
741 private static final int[] RING_OF_WEALTH = {
742 2572, 11988, 11986, 11984, 11982, 11980
745 private int getROWIndex(
int item) {
747 for (
int amulet = 0; amulet < RING_OF_WEALTH.length; amulet++) {
748 if (item == RING_OF_WEALTH[amulet]) {
755 public void useROW() {
756 for (
int row : RING_OF_WEALTH) {
757 int index = getROWIndex(row);
758 if (player.equipment.contains(row)) {
759 player.equipment.set(
Equipment.RING_SLOT,
new Item(RING_OF_WEALTH[index]),
true);
760 player.message(
"<col=7F007F>" + (index == 0 ?
"You have used your last charge." :
"Your ring of wealth has " +
Utility.
convertWord(index).toLowerCase() +
"charge" + (index == 1 ?
"" :
"s") +
" remaining."));
768 if (!interfaceText.containsKey(
id)) {
773 if (t.currentState.equals(text))
775 t.currentState = text;
781 interfaceText.clear();