From 38a280d0a1bf310d1fed5bd87f8afd6fa20108e4 Mon Sep 17 00:00:00 2001 From: ceikry Date: Fri, 13 Aug 2021 16:56:22 -0500 Subject: [PATCH] Fixed an exploit with prayer point decrementing --- .../core/game/node/entity/player/Player.java | 21 +++++ .../entity/player/link/prayer/DrainTask.java | 92 ------------------- .../entity/player/link/prayer/Prayer.java | 13 --- .../entity/player/link/prayer/PrayerType.java | 12 ++- 4 files changed, 28 insertions(+), 110 deletions(-) delete mode 100644 Server/src/main/java/core/game/node/entity/player/link/prayer/DrainTask.java diff --git a/Server/src/main/java/core/game/node/entity/player/Player.java b/Server/src/main/java/core/game/node/entity/player/Player.java index 93249b33c..09814cb0b 100644 --- a/Server/src/main/java/core/game/node/entity/player/Player.java +++ b/Server/src/main/java/core/game/node/entity/player/Player.java @@ -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 diff --git a/Server/src/main/java/core/game/node/entity/player/link/prayer/DrainTask.java b/Server/src/main/java/core/game/node/entity/player/link/prayer/DrainTask.java deleted file mode 100644 index 932769bae..000000000 --- a/Server/src/main/java/core/game/node/entity/player/link/prayer/DrainTask.java +++ /dev/null @@ -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; - } -} diff --git a/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java b/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java index e71e7914f..81474255a 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java +++ b/Server/src/main/java/core/game/node/entity/player/link/prayer/Prayer.java @@ -28,11 +28,6 @@ public final class Prayer { */ private final List 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. diff --git a/Server/src/main/java/core/game/node/entity/player/link/prayer/PrayerType.java b/Server/src/main/java/core/game/node/entity/player/link/prayer/PrayerType.java index f21292e92..d3496426a 100644 --- a/Server/src/main/java/core/game/node/entity/player/link/prayer/PrayerType.java +++ b/Server/src/main/java/core/game/node/entity/player/link/prayer/PrayerType.java @@ -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; }