RuneHive-Game
Loading...
Searching...
No Matches
RangeAccuracyNpc.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.combat.accuracy;
2
3import com.runehive.game.world.entity.combat.CombatType;
4import com.runehive.game.world.entity.combat.FormulaUtils;
5import com.runehive.game.world.entity.combat.attack.FightStyle;
6import com.runehive.game.world.entity.mob.Mob;
7import com.runehive.game.world.entity.mob.npc.Npc;
8import com.runehive.game.world.entity.mob.player.Player;
9import com.runehive.game.world.entity.mob.prayer.Prayer;
10import com.runehive.game.world.entity.skill.Skill;
11import com.runehive.game.world.items.Item;
12import com.runehive.game.world.position.Area;
13import com.runehive.util.Items;
14
15import java.security.SecureRandom;
16
17
18/**
19 * @Author Origin
20 * 2/22/2023
21 */
22public class RangeAccuracyNpc {
23 public static final SecureRandom srand = new SecureRandom();
24
25 public static boolean successful(Mob attacker, Mob defender, CombatType style) {
26 double attackBonus = RangeAccuracy.getAttackRoll(attacker);//getAttackRoll(attacker, defender, style);
27 double defenceBonus = RangeAccuracy.getDefenceRoll(defender);//getDefenceRoll(defender, style);
28 double successfulRoll;
29 double selectedChance = srand.nextDouble();
30
31 if (attackBonus > defenceBonus)
32 successfulRoll = 1D - (defenceBonus + 2D) / (2D * (attackBonus + 1D));
33 else
34 successfulRoll = attackBonus / (2D * (defenceBonus + 1D));
35
36
37 return successfulRoll > selectedChance;
38 }
39
40 public static double getPrayerAttackBonus(Mob attacker) {
41 double prayerBonus = 1;
42 if (attacker.getStrategy().getCombatType().equals(CombatType.RANGED)) {
43 if (attacker.prayer.isActive(Prayer.SHARP_EYE))
44 prayerBonus *= 1.05D; // 5% range level boost
45 else if (attacker.prayer.isActive(Prayer.HAWK_EYE))
46 prayerBonus *= 1.10D; // 10% range level boost
47 else if (attacker.prayer.isActive(Prayer.EAGLE_EYE))
48 prayerBonus *= 1.15D; // 15% range level boost
49 else if (attacker.prayer.isActive(Prayer.RIGOUR))
50 prayerBonus *= 1.20D; // 20% range level boost
51 }
52 return prayerBonus;
53 }
54
55 public static int getDefenceNpc(Mob defender) {
56 return defender.getNpc().definition.getSkills()[1];
57 }
58
59 public static double getEffectiveRanged(Mob attacker, CombatType style) {
60 double effectiveLevel = Math.floor(getRangeLevel(attacker)) * getPrayerAttackBonus(attacker);
61 FightStyle fightStyle = attacker.getCombat().getFightType().getStyle();
62 switch (fightStyle) {
63 case ACCURATE:
64 effectiveLevel += 3.0D;
65 break;
66 }
67
68 effectiveLevel += 8;
69
70 if(attacker.isPlayer()) {
71 if (style.equals(CombatType.RANGED)) {
72 if (FormulaUtils.voidRanger((Player) attacker)) {
73 effectiveLevel *= 1.10D;
74 effectiveLevel = Math.floor(effectiveLevel);
75 }
76 }
77 if (((Player) attacker).equipment.contains(Items.SALVE_AMULET)) {
78 effectiveLevel *= 1.10D;
79 }//END OF UNDEAD
80 if (Area.inWilderness(attacker)) {
81 if (((Player) attacker).equipment.contains(22550)) {
82 effectiveLevel *= 1.50D;
83 }
84 }//END OF WILDERNESS BUFFS
85 if (attacker.isNpc()) {
86 if (((Player) attacker).equipment.contains(Items.SLAYER_HELMET)) {
87 effectiveLevel *= 1.05D;
88 }
89 if (((Player) attacker).equipment.contains(Items.BLACK_SLAYER_HELMET) || ((Player) attacker).equipment.contains(Items.GREEN_SLAYER_HELMET) || ((Player) attacker).equipment.contains(Items.PURPLE_SLAYER_HELMET) || ((Player) attacker).equipment.contains(Items.RED_SLAYER_HELMET) || ((Player) attacker).equipment.contains(21888)) {
90 effectiveLevel *= 1.10D;
91 }
92
93 }
94 }
95 return Math.floor(effectiveLevel);
96 }
97
98 public static double getEffectiveLevelDefender(Mob defender) {
99 return getDefenceNpc(defender) + 9;
100 }
101
102 public static int getRangeLevel(Mob attacker) {
103 int rangeLevel = 1;
104 if (attacker instanceof Npc npc) {
105 if (npc.definition.getSkills() != null)
106 rangeLevel = npc.definition.getSkills()[4];
107 } else {
108 rangeLevel = attacker.skills.getLevel(Skill.RANGED);
109 }
110 return rangeLevel;
111 }
112
113 public static double twistedBowBonus(Mob attacker, Mob defender) {
114 double bonus = 1;
115 double magicLevel = 1;
116 int getMagicLevel = defender.skills.getMaxLevel(Skill.MAGIC);
117 Player player = (Player) attacker;
118 final Item weapon = player.equipment.getWeapon();
119 if (weapon != null) {
120 if (player.equipment.contains(20997)) {
121 if (attacker.isPlayer()) {
122 if (defender instanceof Npc n) {
123 if (n.definition.getSkills() != null)
124 magicLevel = defender.skills.getMaxLevel(Skill.MAGIC) > 350 ? 350 :defender.skills.getMaxLevel(Skill.MAGIC) > 250D ? 250D : defender.skills.getMaxLevel(Skill.MAGIC);
125 } else {
126 magicLevel = getMagicLevel;
127 }
128 bonus += ((140 + (((10 * 3) * magicLevel) - 10) / 100D) - ((((3 * magicLevel) - 100D) * 2)) / 100D);
129 if (bonus > 2.4D)
130 bonus = (int) 2.4;
131 }
132 }
133 }
134 return bonus;
135 }
136
137 public static int getGearAttackBonus(Mob attacker, Mob defender, CombatType style) {
138 int bonus = 1;
139 if (style == CombatType.RANGED) {
140 bonus = attacker.getBonus(4);
141 }
142 if (attacker.getPlayer().equipment.contains(20997)) {
143 bonus *= twistedBowBonus(attacker, defender);
144 }
145 return bonus;
146 }
147
148 public static int getRangeDefenceLevelNpc(Mob defender, CombatType style) {
149 int bonus = 1;
150 if (defender instanceof Npc) {
151 if (style == CombatType.RANGED) {
152 bonus = defender.getNpc().getBonus(9);
153 }
154 }
155 return bonus;
156 }
157
158 public static double getAttackRoll(Mob attacker, Mob defender, CombatType style) {
159 double effectiveRangeLevel = getEffectiveRanged(attacker, style);
160
161 double equipmentRangeBonus = getGearAttackBonus(attacker, defender, style);
162
163 double maxRoll = effectiveRangeLevel * (equipmentRangeBonus);
164
165 return (int) (maxRoll);
166 }
167
168 public static double getDefenceRoll(Mob defender, CombatType style) {
169 double effectiveDefenceLevel = getEffectiveLevelDefender(defender);
170
171 int equipmentRangeBonus = getRangeDefenceLevelNpc(defender, style);
172
173 double maxRoll = effectiveDefenceLevel * (equipmentRangeBonus);
174
175 return (int) maxRoll;
176 }
177
178}
static double getEffectiveRanged(Mob attacker, CombatType style)
static double getDefenceRoll(Mob defender, CombatType style)
static boolean successful(Mob attacker, Mob defender, CombatType style)
static double getAttackRoll(Mob attacker, Mob defender, CombatType style)
static int getRangeDefenceLevelNpc(Mob defender, CombatType style)
static int getGearAttackBonus(Mob attacker, Mob defender, CombatType style)
Handles the mob class.
Definition Mob.java:66
abstract< T extends Mob > CombatStrategy<? super T > getStrategy()
The combat strategy of the mob.
abstract Combat<? extends Mob > getCombat()
The combat of the mob.
final boolean isNpc()
Check if an entity is an npc.
Definition Mob.java:550
final boolean isPlayer()
Check if an entity is a player.
Definition Mob.java:564
Represents a non-player character in the in-game world.
Definition Npc.java:29
This class represents a character controlled by a player.
Definition Player.java:125
boolean isActive(Prayer... prayers)
Checks if all given prayers are active.
Represents a trainable and usable skill.
Definition Skill.java:18
static final int RANGED
The ranged skill id.
Definition Skill.java:33
static final int MAGIC
The magic skill id.
Definition Skill.java:39
int getLevel(int id)
Gets the level of a skill.
int getMaxLevel(int id)
Gets the highest possible level of a skill.
The container class that represents an item that can be interacted with.
Definition Item.java:21
boolean contains(int[] bowsWithNoArrowsRequired)
Handles checking if mobs are in a certain area.
Definition Area.java:13
static boolean inWilderness(Position position)
Definition Area.java:272
static final int RED_SLAYER_HELMET
Definition Items.java:19652
static final int PURPLE_SLAYER_HELMET
Definition Items.java:21269
static final int SLAYER_HELMET
Definition Items.java:11869
static final int BLACK_SLAYER_HELMET
Definition Items.java:19644
static final int SALVE_AMULET
Definition Items.java:4086
static final int GREEN_SLAYER_HELMET
Definition Items.java:19648
The enumerated type whose elements represent the fighting styles.