Merge branch 'fix-crystal-recharge' into 'master'

Fixes to crystal equipment:

See merge request 2009scape/2009scape!283
This commit is contained in:
Ceikry 2021-10-01 02:38:54 +00:00
commit d76a3080c7
3 changed files with 56 additions and 87 deletions

View file

@ -5,6 +5,7 @@ import core.game.content.dialogue.FacialExpression;
import core.game.node.entity.player.Player; import core.game.node.entity.player.Player;
import core.game.node.entity.player.link.quest.Quest; import core.game.node.entity.player.link.quest.Quest;
import core.game.node.item.Item; import core.game.node.item.Item;
import org.rs09.consts.Items;
/** /**
* Handles Eluned's Dialogue for Roving Elves. * Handles Eluned's Dialogue for Roving Elves.
@ -54,8 +55,8 @@ public class ElunedDialogue extends DialoguePlugin {
} }
break; break;
case 1001: case 1001:
if (quest.getStage(player) >= 100) { if (quest.getStage(player) >= 100 && player.getInventory().contains(Items.TINY_ELF_CRYSTAL_6103, 1)) {
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I am looking to buy teleportation crystals."); interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I am looking to recharge teleportation crystals.");
stage = 1200; stage = 1200;
} else { } else {
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm just looking around."); interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "I'm just looking around.");
@ -76,23 +77,28 @@ public class ElunedDialogue extends DialoguePlugin {
stage = 500; stage = 500;
break; break;
case 1200: case 1200:
interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Very well. I'll sell you a brand new teleportation", "crystal for 750 gold. What do you say?"); int timesRecharged = player.getAttribute("rovingelves:crystal-teleport-recharges", 0);
int price = crystalTeleportPrice(timesRecharged);
interpreter.sendDialogues(1679, FacialExpression.HALF_GUILTY, "Very well. I'll recharge your teleportation", String.format("crystal for %d gold. What do you say?", price));
stage = 1202; stage = 1202;
break; break;
case 1202: case 1202:
interpreter.sendOptions("Select an Option", "Buy a crystal", "Nevermind"); interpreter.sendOptions("Select an Option", "Recharge a crystal", "Nevermind");
stage = 1203; stage = 1203;
break; break;
case 1203: case 1203:
switch (buttonId) { switch (buttonId) {
case 1: case 1:
stage = 1204; stage = 1204;
if (!player.getInventory().contains(995, 750)) { timesRecharged = player.getAttribute("rovingelves:crystal-teleport-recharges", 0);
price = crystalTeleportPrice(timesRecharged);
if (!player.getInventory().contains(995, price)) {
interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Actually, I don't have enough coins."); interpreter.sendDialogues(player, FacialExpression.HALF_GUILTY, "Actually, I don't have enough coins.");
} else { } else {
interpreter.sendDialogue("You purchase an elven teleportation crystal for 750 gold."); interpreter.sendDialogue(String.format("Eluned recharges your elven teleportation crystal for %d gold.", price));
if (player.getInventory().remove(new Item(995, 750))) { if (player.getInventory().remove(new Item(Items.TINY_ELF_CRYSTAL_6103)) && player.getInventory().remove(new Item(995, price))) {
player.getInventory().add(new Item(6099, 1)); player.getInventory().add(new Item(Items.TELEPORT_CRYSTAL_4_6099, 1));
player.incrementAttribute("/save:rovingelves:crystal-teleport-recharges", 1);
} }
} }
break; break;
@ -184,4 +190,9 @@ public class ElunedDialogue extends DialoguePlugin {
} }
return true; return true;
} }
// 750 for the 0th recharge, decreasing by 150 per recharge down to 150
public int crystalTeleportPrice(int timesRecharged) {
return Math.max(750 - 150 * timesRecharged, 150);
}
} }

View file

@ -239,7 +239,7 @@ public class IslwynDialogue extends DialoguePlugin {
case 33: case 33:
switch (buttonId) { switch (buttonId) {
case 1: case 1:
interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Ah, very well.", "I will sell you a new bow or shield for 750,000 coins."); interpreter.sendDialogues(1680, FacialExpression.HALF_GUILTY, "Ah, very well.", "I will sell you a new bow or shield for 900,000 coins.");
stage = 37; stage = 37;
break; break;
case 2: case 2:
@ -269,13 +269,16 @@ public class IslwynDialogue extends DialoguePlugin {
interpreter.sendDialogue("You don't have any seeds to recharge."); interpreter.sendDialogue("You don't have any seeds to recharge.");
stage = 500; stage = 500;
} }
if (!player.getInventory().contains(995, 500000)) { int timesRecharged = player.getAttribute("rovingelves:crystal-equip-recharges", 0);
interpreter.sendDialogue("You don't have enough coins."); int price = crystalWeaponPrice(timesRecharged);
if (!player.getInventory().contains(995, price)) {
interpreter.sendDialogue(String.format("You don't have enough coins, you need %d.", price));
stage = 500; stage = 500;
} }
if (player.getInventory().contains(995, 500000) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { if (player.getInventory().contains(995, price) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) {
if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, 500000))) { if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, price))) {
player.getInventory().add(new Item(4214, 1)); player.getInventory().add(new Item(4214, 1));
player.incrementAttribute("/save:rovingelves:crystal-equip-recharges", 1);
end(); end();
} }
} }
@ -285,13 +288,16 @@ public class IslwynDialogue extends DialoguePlugin {
interpreter.sendDialogue("You don't have any seeds to recharge."); interpreter.sendDialogue("You don't have any seeds to recharge.");
stage = 500; stage = 500;
} }
if (!player.getInventory().contains(995, 500000)) { timesRecharged = player.getAttribute("rovingelves:crystal-equip-recharges", 0);
price = crystalWeaponPrice(timesRecharged);
if (!player.getInventory().contains(995, price)) {
interpreter.sendDialogue("You don't have enough coins."); interpreter.sendDialogue("You don't have enough coins.");
stage = 500; stage = 500;
} }
if (player.getInventory().contains(995, 500000) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) { if (player.getInventory().contains(995, price) && player.getInventory().contains(RovingElves.CRYSTAL_SEED.getId(), 1)) {
if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, 500000))) { if (player.getInventory().remove(RovingElves.CRYSTAL_SEED) && player.getInventory().remove(new Item(995, price))) {
player.getInventory().add(new Item(4225, 1)); player.getInventory().add(new Item(4225, 1));
player.incrementAttribute("/save:rovingelves:crystal-equip-recharges", 1);
end(); end();
} }
} }
@ -313,12 +319,13 @@ public class IslwynDialogue extends DialoguePlugin {
} }
break; break;
case 39: case 39:
if (!player.getInventory().contains(995, 750000)) { price = crystalWeaponPrice(0);
if (!player.getInventory().contains(995, price)) {
interpreter.sendDialogue("You don't have enough coins."); interpreter.sendDialogue("You don't have enough coins.");
stage = 500; stage = 500;
} }
if (player.getInventory().contains(995, 750000)) { if (player.getInventory().contains(995, price)) {
if (player.getInventory().remove(new Item(995, 750000))) { if (player.getInventory().remove(new Item(995, price))) {
if (!player.getInventory().add(new Item(4214, 1))) { if (!player.getInventory().add(new Item(4214, 1))) {
GroundItemManager.create(new Item(4214, 1), player); GroundItemManager.create(new Item(4214, 1), player);
} }
@ -327,12 +334,13 @@ public class IslwynDialogue extends DialoguePlugin {
} }
break; break;
case 40: case 40:
if (!player.getInventory().contains(995, 750000)) { price = crystalWeaponPrice(0);
if (!player.getInventory().contains(995, price)) {
interpreter.sendDialogue("You don't have enough coins."); interpreter.sendDialogue("You don't have enough coins.");
stage = 500; stage = 500;
} }
if (player.getInventory().contains(995, 750000)) { if (player.getInventory().contains(995, price)) {
if (player.getInventory().remove(new Item(995, 750000))) { if (player.getInventory().remove(new Item(995, price))) {
if (!player.getInventory().add(new Item(4225, 1))) { if (!player.getInventory().add(new Item(4225, 1))) {
GroundItemManager.create(new Item(4225, 1), player); GroundItemManager.create(new Item(4225, 1), player);
} }
@ -371,4 +379,9 @@ public class IslwynDialogue extends DialoguePlugin {
} }
return true; return true;
} }
// 900k for the 0th recharge (or for new bows), decreasing by 180k per recharge down to 180k
public int crystalWeaponPrice(int timesRecharged) {
return Math.max(900000 - 180000 * timesRecharged, 180000);
}
} }

View file

@ -32,7 +32,7 @@ public final class TeleportCrystalPlugin extends OptionHandler {
@Override @Override
public boolean handle(Player player, Node node, String option) { public boolean handle(Player player, Node node, String option) {
if (true) { if (!WildernessZone.checkTeleport(player, 20)) {
player.getPacketDispatch().sendMessage("The crystal is unresponsive."); player.getPacketDispatch().sendMessage("The crystal is unresponsive.");
return true; return true;
} }
@ -89,12 +89,10 @@ public final class TeleportCrystalPlugin extends OptionHandler {
itemId = (Integer) args[1]; itemId = (Integer) args[1];
switch ((Integer) args[0]) { switch ((Integer) args[0]) {
case 1: case 1:
interpreter.sendOptions("Select an Option", "Save your location", "Teleport to your location", "Contact Bill Teach", "Teleport to Lletya"); interpreter.sendOptions("Select an Option", "Teleport to Lletya", "Cancel");
stage = 100; stage = 100;
break; break;
} }
return true; return true;
} }
@ -106,68 +104,14 @@ public final class TeleportCrystalPlugin extends OptionHandler {
case 100: case 100:
switch(buttonId) { switch(buttonId) {
case 1: case 1:
interpreter.sendDialogues(npc, null, "That'll cost you 100,000 coins, is that okay?");
stage = 1000;
break;
case 2:
player.getTeleporter().send(new Location(player.getGlobalData().getSavedX(), player.getGlobalData().getSavedY(), player.getGlobalData().getSavedH()), TeleportType.NORMAL);
end();
degrade(player, new Item(itemId));
break;
case 3:
interpreter.sendDialogues(npc, null, "This will use up a charge of your crystal,", "are you sure you wish to continue?");
stage = 3000;
break;
case 4:
player.getTeleporter().send(new Location(2329, 3172), TeleportType.NORMAL); player.getTeleporter().send(new Location(2329, 3172), TeleportType.NORMAL);
break;
}
break;
case 1000:
interpreter.sendOptions("Select an Option", "Yes", "No");
stage = 2000;
break;
case 2000:
switch(buttonId) {
case 1:
if(player.getInventory().getAmount(995) >= 100000) {
end();
player.sendMessage("Your location has been saved succesfully!");
player.getInventory().remove(new Item(995, 100000));
player.getGlobalData().setSavedLocation(player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ());
} else {
interpreter.sendDialogues(npc, null, "I'm sorry, but you don't have enough coins", "to cover this.");
stage = 7;
}
break;
case 2:
interpreter.sendOptions("Select an Option", "Save your location", "Teleport to your location", "Contact Bill Teach", "Teleport to Lletya");
stage = 100;
break;
}
break;
case 3000:
interpreter.sendOptions("Select an Option", "Yes", "No");
stage = 4000;
break;
case 4000:
switch(buttonId) {
case 1:
player.getDialogueInterpreter().open(billTeach.getId());
degrade(player, new Item(itemId)); degrade(player, new Item(itemId));
break; break;
case 2: case 2:
interpreter.sendOptions("Select an Option", "Save your location", "Teleport to your location", "Contact Bill Teach", "Teleport to Lletya"); end();
stage = 100; break;
break;
} }
break; break;
case 7:
end();
break;
} }
return true; return true;
} }
@ -187,7 +131,8 @@ public final class TeleportCrystalPlugin extends OptionHandler {
p.getPacketDispatch().sendMessage("Your teleportation crystal has degraded from use."); p.getPacketDispatch().sendMessage("Your teleportation crystal has degraded from use.");
} else { } else {
p.getInventory().remove(new Item(id, 1)); p.getInventory().remove(new Item(id, 1));
p.getPacketDispatch().sendMessages("Your teleportation crystal has turned into dust,", "you can purchase a new one from Mama."); p.getInventory().add(new Item(newItem, 1));
p.getPacketDispatch().sendMessages("Your teleportation crystal has degraded to a tiny elf crystal,", "Eluned can re-enchant it.");
} }
} }