mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-19 04:50:23 -07:00
Fixed an exploit with prayer point decrementing
This commit is contained in:
parent
c376997fe2
commit
38a280d0a1
4 changed files with 28 additions and 110 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue