Fixed an exploit with prayer point decrementing

This commit is contained in:
ceikry 2021-08-13 16:56:22 -05:00
parent c376997fe2
commit 38a280d0a1
4 changed files with 28 additions and 110 deletions

View file

@ -80,6 +80,7 @@ import rs09.game.ge.PlayerGrandExchange;
import rs09.game.node.entity.combat.CombatSwingHandler;
import rs09.game.node.entity.combat.equipment.EquipmentDegrader;
import rs09.game.node.entity.skill.runecrafting.PouchManager;
import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks;
import rs09.game.node.entity.state.newsys.State;
import rs09.game.node.entity.state.newsys.StateRepository;
import rs09.game.world.GameWorld;
@ -354,6 +355,8 @@ public class Player extends Entity {
private int archeryTotal = 0;
private int prayerActiveTicks = 0;
/**
* Constructs a new {@code Player} {@code Object}.
* @param details The player's details.
@ -497,6 +500,24 @@ public class Player extends Entity {
details.getSession().disconnect();
getSession().setLastPing(Long.MAX_VALUE);
}
//Decrements prayer points
if(!prayer.getActive().isEmpty() && prayerActiveTicks % 2 == 0){
double amountDrain = 0;
for(PrayerType type : prayer.getActive()){
double drain = type.getDrain();
double bonus = (1/30f) * prayer.getPlayer().getProperties().getBonuses()[12];
drain = drain * (1 + bonus);
drain = 0.6 / drain;
amountDrain += drain;
}
if(SkillcapePerks.isActive(SkillcapePerks.DIVINE_FAVOR,prayer.getPlayer()) && RandomFunction.random(100) <= 10){
amountDrain = 0;
}
getSkills().decrementPrayerPoints(amountDrain);
} else {
prayerActiveTicks = 0;
}
}
@Override

View file

@ -1,92 +0,0 @@
package core.game.node.entity.player.link.prayer;
import core.game.node.Node;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.system.task.NodeTask;
import core.game.world.map.zone.ZoneBorders;
import core.tools.RandomFunction;
import rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks;
/**
* Represents an event used to drain prayer points.
* @author 'Vexia
*/
public final class DrainTask extends NodeTask {
/**
* Constructs a new {@code DrainTask} {@code Object}.
*/
public DrainTask() {
super(2);
}
@Override
public boolean exec(Node node, Node... n) {
Player player = node.asPlayer();
if (player.getPrayer().getActive().isEmpty()) {
getPulse().stop();
return true;
}
player.getSkills().decrementPrayerPoints(getDrain(player.getPrayer()));
if (player.getPrayer().getActive().contains(PrayerType.PIETY)
&& new ZoneBorders(2732, 3467, 2739, 3471, 0).insideBorder(player)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 3);
}
return player.getSkills().getPrayerPoints() <= 0;
}
@Override
public void stop(Node node, Node... n) {
final Player player = node.asPlayer();
if (player.getSkills().getPrayerPoints() <= 0) {
player.getPrayer().reset();
player.getAudioManager().send(2672);
player.getPacketDispatch().sendMessage("You have run out of prayer points, you must recharge at an altar.");
}
super.stop(node, n);
}
@Override
public void start(Node node, Node... n) {
node.asPlayer().removeAttribute("prayer-message");
super.start(node, n);
}
@Override
public boolean removeFor(String s, Node node, Node... n) {
return true;
}
/**
* Method used to initialize this pulse.
* @param player the player.
*/
public void init(final Player player) {
if (getPulse() == null || !getPulse().isRunning()) {
schedule(player);
}
}
/**
* Method used to return that drain tick.
* @param prayer the prayer manager.
* @return the drain tick, converted to an integer.
*/
public double getDrain(final Prayer prayer) {
double amountDrain = 0;
for (PrayerType type : prayer.getActive()) {
double drain = type.getDrain();
double bonus = (1/30f) * prayer.getPlayer().getProperties().getBonuses()[12];
drain = drain * (1 + bonus);
drain = 0.6 / drain;
amountDrain += drain;
}
if(SkillcapePerks.isActive(SkillcapePerks.DIVINE_FAVOR,prayer.getPlayer()) && RandomFunction.random(100) <= 10){
amountDrain = 0;
}
return amountDrain;
}
}

View file

@ -28,11 +28,6 @@ public final class Prayer {
*/
private final List<PrayerType> active = new ArrayList<>(20);
/**
* Represents the current draining task.
*/
private final DrainTask task = new DrainTask();
/**
* Represents the player instance.
*/
@ -159,14 +154,6 @@ public final class Prayer {
return player;
}
/**
* Gets the task.
* @return The task.
*/
public DrainTask getTask() {
return task;
}
/**
* Gets the active prayers.
* @return The active.

View file

@ -1,10 +1,12 @@
package core.game.node.entity.player.link.prayer;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.node.entity.skill.SkillBonus;
import core.game.node.entity.skill.SkillRestoration;
import core.game.node.entity.skill.Skills;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio;
import core.game.world.map.zone.ZoneBorders;
import core.tools.StringUtils;
import java.util.List;
@ -251,16 +253,16 @@ public enum PrayerType {
if (on) {
flag(player, this);
player.getPrayer().getActive().add(this);
player.getPrayer().getTask().init(player);
iconify(player, getIcon(player, this));
player.getAudioManager().send(getSound());
if (this == PrayerType.PIETY
&& new ZoneBorders(2732, 3467, 2739, 3471, 0).insideBorder(player)) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.SEERS_VILLAGE, 2, 3);
}
} else {
player.getPrayer().getActive().remove(this);
findNextIcon(player);
if (player.getPrayer().getActive().isEmpty()) {
player.getPrayer().getTask().stop(player);
return true;
}
}
return true;
}