Rewrote altar praying

Added the Tai Bwo Wannai Trio as quest requirement for praying at the tribal statue
This commit is contained in:
Bonesy 2024-07-13 04:37:21 +00:00 committed by Ryan
parent 6f9a975f7a
commit 0165d373bd
5 changed files with 255 additions and 257 deletions

View file

@ -0,0 +1,63 @@
package content.global.skill.magic
import core.api.*
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import core.game.node.Node
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.SpellBookManager.SpellBook
import core.game.node.entity.skill.Skills
import org.rs09.consts.Scenery
import org.rs09.consts.Sounds
class MagicAltarListener : InteractionListener {
override fun defineListeners() {
on(intArrayOf(ANCIENT_ALTAR, LUNAR_ALTAR), IntType.SCENERY, "pray-at", "pray") { player, node ->
if (meetsRequirements(player, node)) {
swapSpellBook(player, node)
}
return@on true
}
}
private fun meetsRequirements(player: Player, altar: Node): Boolean {
val level = if (altar.id == ANCIENT_ALTAR) 50 else 65
if (!hasRequirement(player, if (altar.id == ANCIENT_ALTAR) "Desert Treasure" else "Lunar Diplomacy")) {
return false
}
if (!hasLevelStat(player, Skills.MAGIC, level)) {
sendMessage(player, "You need a Magic level of at least $level in order to do this.")
return false
}
return true
}
private fun swapSpellBook(player: Player, altar: Node) {
lock(player, 3)
playAudio(player, Sounds.PRAYER_RECHARGE_2674)
animate(player, 645)
if (altar.id == ANCIENT_ALTAR) {
player.skills.decrementPrayerPoints(player.skills.prayerPoints)
}
if (SpellBook.forInterface(player.spellBookManager.spellBook) == if (altar.id == ANCIENT_ALTAR) SpellBook.ANCIENT else SpellBook.LUNAR) {
sendMessage(player, if (altar.id == ANCIENT_ALTAR) "You feel a strange drain upon your memory..." else "Modern spells activated!")
player.spellBookManager.setSpellBook(SpellBook.MODERN)
player.spellBookManager.update(player)
} else {
sendMessage(player, if (altar.id == ANCIENT_ALTAR) "You feel a strange wisdom fill your mind..." else "Lunar spells activated!")
player.spellBookManager.setSpellBook(if (altar.id == ANCIENT_ALTAR) SpellBook.ANCIENT else SpellBook.LUNAR)
player.spellBookManager.update(player)
}
}
companion object {
private const val ANCIENT_ALTAR = Scenery.ALTAR_6552
private const val LUNAR_ALTAR = Scenery.ALTAR_17010
}
}

View file

@ -0,0 +1,165 @@
package content.global.skill.prayer
import core.api.*
import core.game.event.PrayerPointsRechargeEvent
import core.game.interaction.IntType
import core.game.interaction.InteractionListener
import core.game.interaction.QueueStrength
import core.game.node.Node
import core.game.node.entity.player.Player
import core.game.node.entity.player.link.TeleportManager
import core.game.node.entity.skill.Skills
import core.game.world.map.Location
import org.rs09.consts.Scenery
import org.rs09.consts.Sounds
class PrayerAltarListener : InteractionListener {
override fun defineListeners() {
on(altars, IntType.SCENERY, "pray", "pray-at") { player, node ->
if (node.id == Scenery.TRIBAL_STATUE_3863 && !hasRequirement(player, "Tai Bwo Wannai Trio")) {
// https://runescape.wiki/w/Tribal_Statue?oldid=1940922
return@on true
}
if (!pray(player, node)) {
if (node.id != Scenery.ELIDINIS_STATUETTE_10439) return@on true
}
if (node.id == Scenery.ELIDINIS_STATUETTE_10439) {
// https://youtu.be/kEwYhnrQCu8?t=727 & https://youtu.be/b9Wy1JWDes8?t=413
setTempLevel(player, Skills.HITPOINTS, getStatLevel(player, Skills.HITPOINTS).plus(7))
sendMessage(player, "You feel much healthier after praying in the shrine.")
}
if (node.id == Scenery.CHAOS_ALTAR_412) {
lock(player, 4)
queueScript(player, 4, QueueStrength.STRONG) {
sendMessage(player, "It's a trap!")
teleport(player, Location(2583, 9576, 0), TeleportManager.TeleportType.INSTANT)
return@queueScript stopExecuting(player)
}
}
return@on true
}
on(Scenery.CHAOS_ALTAR_61, IntType.SCENERY, "check") { player, _ ->
if (getQuestStage(player, "Merlin's Crystal") == 70) {
sendDialogue(player, "You find a small inscription at the bottom of the altar. It reads: 'Snarthon Candtrick Termanto'.")
setQuestStage(player, "Merlin's Crystal", 80)
} else {
sendMessage(player, "An altar of the evil god Zamorak.")
}
return@on true
}
}
private fun pray(player: Player, node: Node): Boolean {
val prayerLevel = getStatLevel(player, Skills.PRAYER).plus(if (node.id in boostedAltars) 2 else 0)
if (player.skills.prayerPoints >= prayerLevel.toDouble()) {
sendMessage(player, "You already have full prayer points.")
return false
}
lock(player, 3)
animate(player, 645)
playAudio(player, Sounds.PRAYER_RECHARGE_2674)
setTempLevel(player, Skills.PRAYER, prayerLevel)
sendMessage(player, "You recharge your prayer points.")
player.dispatch(PrayerPointsRechargeEvent(node))
return true
}
companion object {
private val altars = intArrayOf(
Scenery.ALTAR_409,
Scenery.ALTAR_2478,
Scenery.ALTAR_2479,
Scenery.ALTAR_2480,
Scenery.ALTAR_2481,
Scenery.ALTAR_2482,
Scenery.ALTAR_2483,
Scenery.ALTAR_2484,
Scenery.ALTAR_2485,
Scenery.ALTAR_2486,
Scenery.ALTAR_2487,
Scenery.ALTAR_2488,
Scenery.ALTAR_2489,
Scenery.ALTAR_2640,
Scenery.ALTAR_4008,
Scenery.ALTAR_8749,
Scenery.ALTAR_10639,
Scenery.ALTAR_10640,
Scenery.ALTAR_13179,
Scenery.ALTAR_13180,
Scenery.ALTAR_13181,
Scenery.ALTAR_13182,
Scenery.ALTAR_13183,
Scenery.ALTAR_13184,
Scenery.ALTAR_13185,
Scenery.ALTAR_13186,
Scenery.ALTAR_13187,
Scenery.ALTAR_13188,
Scenery.ALTAR_13189,
Scenery.ALTAR_13190,
Scenery.ALTAR_13191,
Scenery.ALTAR_13192,
Scenery.ALTAR_13193,
Scenery.ALTAR_13194,
Scenery.ALTAR_13195,
Scenery.ALTAR_13196,
Scenery.ALTAR_13197,
Scenery.ALTAR_13198,
Scenery.ALTAR_13199,
Scenery.ALTAR_15050,
Scenery.ALTAR_15051,
Scenery.ALTAR_18254,
Scenery.ALTAR_19145,
Scenery.ALTAR_20377,
Scenery.ALTAR_20378,
Scenery.ALTAR_20379,
Scenery.ALTAR_24343,
Scenery.ALTAR_27306,
Scenery.ALTAR_27307,
Scenery.ALTAR_27308,
Scenery.ALTAR_27309,
Scenery.ALTAR_27334,
Scenery.ALTAR_27338,
Scenery.ALTAR_27339,
Scenery.ALTAR_27661,
Scenery.ALTAR_30624,
Scenery.ALTAR_30726,
Scenery.ALTAR_34616,
Scenery.ALTAR_36972,
Scenery.ALTAR_37630,
Scenery.ALTAR_37901,
Scenery.ALTAR_37902,
Scenery.ALTAR_37903,
Scenery.ALTAR_37904,
Scenery.ALTAR_37905,
Scenery.ALTAR_37906,
Scenery.ALTAR_37907,
Scenery.ALTAR_37908,
Scenery.ALTAR_37909,
Scenery.ALTAR_37910,
Scenery.ALTAR_37911,
Scenery.ALTAR_37912,
Scenery.ALTAR_39547,
Scenery.ALTAR_39842,
Scenery.CHAOS_ALTAR_61,
Scenery.CHAOS_ALTAR_411,
Scenery.CHAOS_ALTAR_412,
Scenery.CHAOS_ALTAR_32079,
Scenery.CHAOS_ALTAR_37990,
Scenery.GORILLA_STATUE_4858,
Scenery.GORILLA_STATUE_4859,
Scenery.ALTAR_OF_GUTHIX_410,
Scenery.ALTAR_OF_GUTHIX_28698,
Scenery.ALTAR_OF_NATURE_3521,
Scenery.TRIBAL_STATUE_3863,
Scenery.ELIDINIS_STATUETTE_10439,
Scenery.DECAYED_ALTAR_37985
)
private val boostedAltars = intArrayOf(Scenery.ALTAR_2640, Scenery.ALTAR_OF_NATURE_3521)
}
}

View file

@ -1,254 +0,0 @@
package content.global.skill.prayer;
import core.cache.def.impl.SceneryDefinition;
import core.game.component.Component;
import core.game.node.entity.player.link.prayer.PrayerType;
import core.plugin.Initializable;
import core.game.node.entity.skill.Skills;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.SpellBookManager.SpellBook;
import core.game.node.entity.player.link.diary.DiaryType;
import core.game.node.entity.player.link.quest.Quest;
import core.game.world.map.Location;
import core.game.world.update.flag.context.Animation;
import core.plugin.Plugin;
import org.rs09.consts.Sounds;
import static core.api.ContentAPIKt.hasRequirement;
import static core.api.ContentAPIKt.playAudio;
/**
* Handles the praying at an alter.
* @author Vexia
*/
@Initializable
public class PrayerAltarPlugin extends OptionHandler {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
SceneryDefinition.setOptionHandler("pray-at", this);
SceneryDefinition.setOptionHandler("pray", this);
SceneryDefinition.forId(61).getHandlers().put("option:check", this);
return this;
}
@Override
public boolean handle(Player player, Node node, String option) {
if (option.equalsIgnoreCase("check")) {
final Quest quest = player.getQuestRepository().getQuest("Merlin's Crystal");
if (quest.getStage(player) == 70) {
player.getDialogueInterpreter().sendDialogue("You find a small inscription at the bottom of the altar. It reads:", "'Snarthon Candtrick Termanto'.");
quest.setStage(player, 80);
return true;
}
player.getPacketDispatch().sendMessage("An altar of the evil god Zamorak.");
return true;
}
Altar altar = Altar.forId(node.getId());
if (altar != null) {
altar.pray(player);
visualize(player);
return true;
}
if (player.getSkills().getPrayerPoints() == player.getSkills().getStaticLevel(Skills.PRAYER)) {
player.getPacketDispatch().sendMessage("You already have full prayer points.");
return true;
}
visualize(player);
player.getSkills().rechargePrayerPoints();
player.getPacketDispatch().sendMessage("You recharge your Prayer points.");
if (node.getId() == 2640) {
player.getSkills().setLevel(Skills.PRAYER, player.getSkills().getStaticLevel(Skills.PRAYER) + 2);
}
if (node.getId() == 409
&& player.getLocation().withinDistance(new Location(3209, 3495, 1))
&& player.getPrayer().getActive().contains(PrayerType.SMITE)) {
player.getAchievementDiaryManager().finishTask(player,DiaryType.VARROCK,2, 4);
}
if (node.getId() == 39842
&& player.getLocation().withinDistance(new Location(2995, 3177, 0))) {
player.getAchievementDiaryManager().finishTask(player,DiaryType.FALADOR,0, 13);
}
// Seers task can be completed with either of camelot altar or seers church altar
if (node.getId() == 19145
&& player.getLocation().withinDistance(new Location(2749, 3496, 1))) {
player.getAchievementDiaryManager().finishTask(player,DiaryType.SEERS_VILLAGE,0, 10);
}
if (node.getId() == 409
&& player.getLocation().withinDistance(new Location(2694, 3462, 0))) {
player.getAchievementDiaryManager().finishTask(player,DiaryType.SEERS_VILLAGE,0, 10);
}
if (node.getLocation().equals(new Location(2571, 9499, 0))) {
player.teleport(new Location(2583, 9576, 0));
player.sendMessage("It's a trap!");
return true;
}
return true;
}
/**
* Visualizes the prayer.
* @param player the player.
*/
public void visualize(Player player) {
player.lock(3);
playAudio(player, Sounds.PRAYER_RECHARGE_2674);
player.animate(Animation.create(645));
}
/**
* An altar.
* @author Vexia
*/
public enum Altar {
ANCIENT(6552, SpellBook.ANCIENT.getInterfaceId(), "You feel a strange wisdom fill your mind...", "You feel a strange drain upon your memory...") {
@Override
public void pray(Player player) {
if (!hasRequirement(player, "Desert Treasure"))
return;
if (player.getSkills().getStaticLevel(Skills.MAGIC) < 50) {
player.sendMessage("You need a Magic level of at least 50 in order to do this.");
return;
}
drain(player);
if (!isPrayerType(player)) {
switchToBook(player);
player.sendMessage(getMessages()[0]);
} else {
revert(player);
player.sendMessage(getMessages()[1]);
}
}
},
LUNAR(17010, SpellBook.LUNAR.getInterfaceId(), "Lunar spells activated!", "Modern spells activated!") {
@Override
public void pray(Player player) {
if (!hasRequirement(player, "Lunar Diplomacy"))
return;
if (player.getSkills().getStaticLevel(Skills.MAGIC) < 65) {
player.sendMessage("You need a Magic level of at least 65 in order to do this.");
return;
}
if (!isPrayerType(player)) {
switchToBook(player);
player.sendMessage(getMessages()[0]);
} else {
revert(player);
player.sendMessage(getMessages()[1]);
}
}
};
/**
* The id.
*/
private int id;
/**
* The book.
*/
private int book;
/**
* The messages.
*/
private String[] messages;
/**
* Constructs a new {@Code Altar} {@Code Object}
* @param id the id.
* @param book the book.
* @param messages the messages.
*/
private Altar(int id, int book, String... messages) {
this.id = id;
this.book = book;
this.messages = messages;
}
/**
* Prays at the altar.
* @param player the player.
*/
public void pray(Player player) {
}
/**
* Reverts the book.
* @param player the player.
*/
public void revert(Player player) {
player.getSpellBookManager().setSpellBook(SpellBook.MODERN);
player.getInterfaceManager().openTab(new Component(SpellBook.values()[SpellBook.MODERN.ordinal()].getInterfaceId()));
}
/**
* Drains the player.
* @param player the player.
*/
public void drain(Player player) {
player.getSkills().decrementPrayerPoints(player.getSkills().getPrayerPoints());
}
/**
* Switches to the book.
* @param player the player.
*/
public void switchToBook(Player player) {
player.getSpellBookManager().setSpellBook(SpellBook.forInterface(book));
player.getInterfaceManager().openTab(new Component(book));
}
/**
* Checks if it is the prayer type.
* @param player the player.
* @return true if so.
*/
public boolean isPrayerType(Player player) {
return player.getSpellBookManager().getSpellBook() == book;
}
/**
* Gets an altar.
* @param id the id.
* @return the altar.
*/
public static Altar forId(int id) {
for (Altar altar : values()) {
if (id == altar.getId()) {
return altar;
}
}
return null;
}
/**
* Gets the id.
* @return the id
*/
public int getId() {
return id;
}
/**
* Gets the book.
* @return the book
*/
public int getBook() {
return book;
}
/**
* Gets the messages.
* @return the messages
*/
public String[] getMessages() {
return messages;
}
}
}

View file

@ -19,6 +19,7 @@ import core.game.diary.DiaryEventHookBase
import core.game.diary.DiaryLevel import core.game.diary.DiaryLevel
import core.game.event.* import core.game.event.*
import core.game.node.entity.skill.Skills import core.game.node.entity.skill.Skills
import core.game.world.map.Location
class FaladorAchievementDiary : DiaryEventHookBase(DiaryType.FALADOR) { class FaladorAchievementDiary : DiaryEventHookBase(DiaryType.FALADOR) {
companion object { companion object {
@ -283,4 +284,14 @@ class FaladorAchievementDiary : DiaryEventHookBase(DiaryType.FALADOR) {
} }
} }
} }
override fun onPrayerPointsRecharged(player: Player, event: PrayerPointsRechargeEvent) {
if (event.altar.id == Scenery.ALTAR_39842 && event.altar.location == Location(2995, 3177, 0)) {
finishTask(
player,
DiaryLevel.EASY,
EasyTasks.PORT_SARIM_RECHARGE_PRAYER_POINTS
)
}
}
} }

View file

@ -14,6 +14,7 @@ import core.game.world.map.Location
import core.game.world.map.zone.ZoneBorders import core.game.world.map.zone.ZoneBorders
import org.rs09.consts.Items import org.rs09.consts.Items
import org.rs09.consts.NPCs import org.rs09.consts.NPCs
import org.rs09.consts.Scenery
class SeersVillageAchievementDiary : DiaryEventHookBase(DiaryType.SEERS_VILLAGE) { class SeersVillageAchievementDiary : DiaryEventHookBase(DiaryType.SEERS_VILLAGE) {
companion object { companion object {
@ -288,7 +289,7 @@ class SeersVillageAchievementDiary : DiaryEventHookBase(DiaryType.SEERS_VILLAGE)
finishTask( finishTask(
player, player,
DiaryLevel.HARD, DiaryLevel.HARD,
HardTasks.HIGH_ALCH_MAGIC_SHORTBOW_INSIDE_BANK HardTasks.HIGH_ALCH_MAGIC_SHORTBOW_INSIDE_BANK
) )
} }
} }
@ -299,7 +300,7 @@ class SeersVillageAchievementDiary : DiaryEventHookBase(DiaryType.SEERS_VILLAGE)
finishTask( finishTask(
player, player,
DiaryLevel.HARD, DiaryLevel.HARD,
HardTasks.DIAL_FAIRY_RING_MCGRUBORS_WOOD HardTasks.DIAL_FAIRY_RING_MCGRUBORS_WOOD
) )
} }
} }
@ -309,8 +310,20 @@ class SeersVillageAchievementDiary : DiaryEventHookBase(DiaryType.SEERS_VILLAGE)
finishTask( finishTask(
player, player,
DiaryLevel.EASY, DiaryLevel.EASY,
EasyTasks.BUY_CANDLE EasyTasks.BUY_CANDLE
) )
} }
} }
override fun onPrayerPointsRecharged(player: Player, event: PrayerPointsRechargeEvent) {
if (player.viewport.region.id == 10806) {
if (event.altar.id == Scenery.ALTAR_409 || event.altar.id == Scenery.ALTAR_19145) {
finishTask(
player,
DiaryLevel.EASY,
EasyTasks.PRAY_AT_ALTAR
)
}
}
}
} }