53 public static final SecureRandom srand =
new SecureRandom();
55 public static boolean successful(
Mob attacker,
Mob defender) {
56 double attackRoll = getAttackRoll(attacker);
57 double defenceRoll = getDefenceRoll(defender);
60 if (attackRoll > defenceRoll)
61 chance = 1D - (defenceRoll + 2D) / (2D * (attackRoll + 1D));
63 chance = attackRoll / (2D * (defenceRoll + 1D));
65 double roll = srand.nextDouble();
71 public static double getPrayerAttackBonus(
Mob attacker) {
72 double prayerBonus = 1;
86 public static double getPrayerDefenseBonus(
Mob defender) {
87 double prayerBonus = 1;
94 public static double getEffectiveLevel(
Mob attacker) {
95 double effectiveLevel = getRangeLevel(attacker);
96 if (attacker instanceof
Player) {
97 effectiveLevel *= getPrayerAttackBonus(attacker);
98 effectiveLevel = Math.floor(effectiveLevel);
100 switch (attacker.
getCombat().getFightType().getStyle()) {
101 case ACCURATE -> effectiveLevel += 3;
102 case CONTROLLED -> effectiveLevel += 1;
107 if (attacker instanceof
Player player) {
109 effectiveLevel *= 1.10;
113 return Math.floor(effectiveLevel);
116 public static int getRangeLevel(
Mob attacker) {
118 if (attacker instanceof
Npc npc) {
119 int[] skills = npc.definition.getSkills();
120 if (skills !=
null) {
129 public static int getRangeBonus(
Mob attacker) {
130 return attacker.getBonus(
Equipment.RANGED_OFFENSE);
133 public static int getDefenceBonus(
Mob defender) {
134 return defender.getBonus(
Equipment.RANGED_DEFENSE);
137 public static double getAttackRoll(
Mob attacker) {
138 double effectiveLevel = getEffectiveLevel(attacker);
139 double bonus = getRangeBonus(attacker);
141 double roll = effectiveLevel * (bonus + 64);
143 if (attacker instanceof
Player player) {
144 final Equipment equipment = player.equipment;
145 if (equipment.contains(25865)
146 || equipment.contains(25867)
147 || equipment.contains(25884)
148 || equipment.contains(25886)
149 || equipment.contains(25888)
150 || equipment.contains(25890)
151 || equipment.contains(25892)
152 || equipment.contains(25894)
153 || equipment.contains(25896)) {
154 if (equipment.contains(23971)) {
157 if (equipment.contains(23975)) {
160 if (equipment.contains(23975)) {
166 return Math.floor(roll);
169 public static double getDefenceRoll(
Mob defender) {
171 double defenceBonus = getDefenceBonus(defender);
173 if (defender instanceof
Player) {
174 defenceLevel *= getPrayerDefenseBonus(defender);
176 switch (defender.
getCombat().getFightType().getStyle()) {
177 case DEFENSIVE -> defenceLevel += 3;
178 case CONTROLLED -> defenceLevel += 1;
184 return defenceLevel * (defenceBonus + 64);