mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-19 13:00:19 -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.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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue