RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
MeleeAccuracy.java
1package com.osroyale.game.world.entity.combat.accuracy;
2
3import com.osroyale.game.world.entity.combat.FormulaUtils;
4import com.osroyale.game.world.entity.mob.Mob;
5import com.osroyale.game.world.entity.mob.player.Player;
6import com.osroyale.game.world.entity.mob.prayer.Prayer;
7import com.osroyale.game.world.entity.skill.Skill;
8
9import java.security.SecureRandom;
10
51
52public class MeleeAccuracy {
53
54 public static final SecureRandom srand = new SecureRandom();
55
56 public static boolean successful(Mob attacker, Mob defender) {
57 double attackRoll = getAttackRoll(attacker);
58 double defenceRoll = getDefenceRoll(defender);
59
60 double chance;
61 if (attackRoll > defenceRoll)
62 chance = 1D - (defenceRoll + 2D) / (2D * (attackRoll + 1D));
63 else
64 chance = attackRoll / (2D * (defenceRoll + 1D));
65
66 double roll = srand.nextDouble();
67
68
69 return chance > roll;
70 }
71
72 public static double getDefenceRoll(Mob defender) {
73 double defenceLevel = defender.skills.getLevel(Skill.DEFENCE);
74 double defenceBonus = getDefenceBonus(defender);
75
76 if (defender instanceof Player) {
77 defenceLevel *= getPrayerDefenseBonus(defender);
78
79 switch (defender.getCombat().getFightType().getStyle()) {
80 case DEFENSIVE -> defenceLevel += 3;
81 case CONTROLLED -> defenceLevel += 1;
82 }
83 } else {
84 defenceLevel += 9;
85 }
86
87 return defenceLevel * (defenceBonus + 64);
88 }
89
90 public static double getAttackRoll(Mob attacker) {
91 double effectiveLevel = getEffectiveLevel(attacker);
92 double attackBonus = getAttackBonus(attacker);
93
94 double roll = effectiveLevel * (attackBonus + 64);
95
96 if (attacker instanceof Player player) {
97 // TODO equipment bonuses
98 }
99
100 return Math.floor(roll);
101 }
102
103 public static double getEffectiveLevel(Mob attacker) {
104 double effectiveLevel = attacker.skills.getLevel(Skill.ATTACK);
105 if (attacker instanceof Player) {
106 effectiveLevel *= getPrayerAttackBonus(attacker);
107 effectiveLevel = Math.floor(effectiveLevel);
108
109 switch (attacker.getCombat().getFightType().getStyle()) {
110 case ACCURATE -> effectiveLevel += 3;
111 case CONTROLLED -> effectiveLevel += 1;
112 }
113 }
114 effectiveLevel += 8;
115
116 if (attacker instanceof Player player) {
117 if (FormulaUtils.voidMelee(player)) {
118 effectiveLevel *= 1.10;
119 }
120 }
121
122 return Math.floor(effectiveLevel);
123 }
124
125 private static double getPrayerDefenseBonus(Mob defender) {
126 double prayerBonus = 1;
127 if (defender.prayer.isActive(Prayer.THICK_SKIN))
128 prayerBonus += 1.05D; // 5% def level boost
129 else if (defender.prayer.isActive(Prayer.ROCK_SKIN))
130 prayerBonus += 1.10D; // 10% def level boost
131 else if (defender.prayer.isActive(Prayer.STEEL_SKIN))
132 prayerBonus += 1.15D; // 15% def level boost
133 else if (defender.prayer.isActive(Prayer.CHIVALRY))
134 prayerBonus += 1.20D; // 20% def level boost
135 else if (defender.prayer.isActive(Prayer.PIETY))
136 prayerBonus += 1.25D; // 25% def level boost
137 return prayerBonus;
138 }
139
140 private static int getDefenceBonus(Mob defender) {
141 return defender.getBonus(defender.getCombat().getFightType().getCorrespondingBonus());
142 }
143
144 private static int getAttackBonus(Mob attacker) {
145 return attacker.getBonus(attacker.getCombat().getFightType().getBonus());
146 }
147
148 private static double getPrayerAttackBonus(Mob attacker) {
149 double prayerBonus = 1;
150 if (attacker.prayer.isActive(Prayer.THICK_SKIN))
151 prayerBonus += 1.05D; // 5% def level boost
152 else if (attacker.prayer.isActive(Prayer.ROCK_SKIN))
153 prayerBonus += 1.10D; // 10% def level boost
154 else if (attacker.prayer.isActive(Prayer.STEEL_SKIN))
155 prayerBonus += 1.15D; // 15% def level boost
156 else if (attacker.prayer.isActive(Prayer.CHIVALRY))
157 prayerBonus += 1.20D; // 20% def level boost
158 else if (attacker.prayer.isActive(Prayer.PIETY))
159 prayerBonus += 1.25D; // 25% def level boost
160 return prayerBonus;
161 }
162
163}
abstract Combat<? extends Mob > getCombat()