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.CombatSwingHandler;
import rs09.game.node.entity.combat.equipment.EquipmentDegrader; import rs09.game.node.entity.combat.equipment.EquipmentDegrader;
import rs09.game.node.entity.skill.runecrafting.PouchManager; 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.State;
import rs09.game.node.entity.state.newsys.StateRepository; import rs09.game.node.entity.state.newsys.StateRepository;
import rs09.game.world.GameWorld; import rs09.game.world.GameWorld;
@ -354,6 +355,8 @@ public class Player extends Entity {
private int archeryTotal = 0; private int archeryTotal = 0;
private int prayerActiveTicks = 0;
/** /**
* Constructs a new {@code Player} {@code Object}. * Constructs a new {@code Player} {@code Object}.
* @param details The player's details. * @param details The player's details.
@ -497,6 +500,24 @@ public class Player extends Entity {
details.getSession().disconnect(); details.getSession().disconnect();
getSession().setLastPing(Long.MAX_VALUE); 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 @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); private final List<PrayerType> active = new ArrayList<>(20);
/**
* Represents the current draining task.
*/
private final DrainTask task = new DrainTask();
/** /**
* Represents the player instance. * Represents the player instance.
*/ */
@ -159,14 +154,6 @@ public final class Prayer {
return player; return player;
} }
/**
* Gets the task.
* @return The task.
*/
public DrainTask getTask() {
return task;
}
/** /**
* Gets the active prayers. * Gets the active prayers.
* @return The active. * @return The active.

View file

@ -1,10 +1,12 @@
package core.game.node.entity.player.link.prayer; 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.SkillBonus;
import core.game.node.entity.skill.SkillRestoration; import core.game.node.entity.skill.SkillRestoration;
import core.game.node.entity.skill.Skills; import core.game.node.entity.skill.Skills;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.audio.Audio; import core.game.node.entity.player.link.audio.Audio;
import core.game.world.map.zone.ZoneBorders;
import core.tools.StringUtils; import core.tools.StringUtils;
import java.util.List; import java.util.List;
@ -251,16 +253,16 @@ public enum PrayerType {
if (on) { if (on) {
flag(player, this); flag(player, this);
player.getPrayer().getActive().add(this); player.getPrayer().getActive().add(this);
player.getPrayer().getTask().init(player);
iconify(player, getIcon(player, this)); iconify(player, getIcon(player, this));
player.getAudioManager().send(getSound()); 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 { } else {
player.getPrayer().getActive().remove(this); player.getPrayer().getActive().remove(this);
findNextIcon(player); findNextIcon(player);
if (player.getPrayer().getActive().isEmpty()) {
player.getPrayer().getTask().stop(player);
return true;
}
} }
return true; return true;
} }