Refactored some runecrafting code

Corrected the Ourania altar reward, now fully authentic
This commit is contained in:
Player Name 2025-01-20 13:49:58 +00:00 committed by Ryan
parent 39634b6caf
commit 9af776e3c6

View file

@ -2,6 +2,7 @@ package content.global.skill.runecrafting;
import content.global.handlers.item.equipment.fistofguthixgloves.FOGGlovesManager;
import core.ServerConstants;
import core.api.Container;
import core.game.container.impl.EquipmentContainer;
import core.game.node.entity.impl.Animator.Priority;
import core.game.node.entity.player.Player;
@ -28,6 +29,7 @@ import java.util.Arrays;
* A class used to craft runes.
*
* @author Vexia
* @author Player Name
*/
public final class RuneCraftPulse extends SkillPulse<Item> {
@ -111,36 +113,36 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
if (!hasRequirement(player, "Legacy of Seergaze"))
return false;
}
if (!altar.isOurania() && player.getSkills().getLevel(Skills.RUNECRAFTING) < rune.getLevel()) {
player.getPacketDispatch().sendMessage("You need a Runecrafting level of at least " + rune.getLevel() + " to craft this rune.");
if (!altar.isOurania() && getDynLevel(player, Skills.RUNECRAFTING) < rune.getLevel()) {
sendMessage(player, "You need a Runecrafting level of at least " + rune.getLevel() + " to craft this rune.");
return false;
}
if (combination && !player.getInventory().containsItem(PURE_ESSENCE)) {
player.getPacketDispatch().sendMessage("You need pure essence to craft this rune.");
if (combination && amountInInventory(player, PURE_ESSENCE.getId()) == 0) {
sendMessage(player, "You need pure essence to craft this rune.");
return false;
}
if (!altar.isOurania() && !rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE)) {
player.getPacketDispatch().sendMessage("You need pure essence to craft this rune.");
if (!altar.isOurania() && !rune.isNormal() && amountInInventory(player, PURE_ESSENCE.getId()) == 0) {
sendMessage(player, "You need pure essence to craft this rune.");
return false;
}
if (!altar.isOurania() && rune.isNormal() && !player.getInventory().containsItem(PURE_ESSENCE) && !player.getInventory().containsItem(RUNE_ESSENCE)) {
player.getPacketDispatch().sendMessage("You need rune essence or pure essence in order to craft this rune.");
if (!altar.isOurania() && rune.isNormal() && amountInInventory(player, PURE_ESSENCE.getId()) == 0 && amountInInventory(player, RUNE_ESSENCE.getId()) == 0) {
sendMessage(player, "You need rune essence or pure essence in order to craft this rune.");
return false;
}
if (altar.isOurania() && !player.getInventory().containsItem(PURE_ESSENCE)) {
player.getPacketDispatch().sendMessage("You need pure essence to craft this rune.");
if (altar.isOurania() && amountInInventory(player, PURE_ESSENCE.getId()) == 0) {
sendMessage(player, "You need pure essence to craft this rune.");
return false;
}
if (combination && player.getSkills().getLevel(Skills.RUNECRAFTING) < combo.getLevel()) {
player.getPacketDispatch().sendMessage("You need a Runecrafting level of at least " + combo.getLevel() + " to combine this rune.");
if (combination && getDynLevel(player, Skills.RUNECRAFTING) < combo.getLevel()) {
sendMessage(player, "You need a Runecrafting level of at least " + combo.getLevel() + " to combine this rune.");
return false;
}
if (node != null) {
if (node.getName().contains("rune") && !hasSpellImbue()) {
final Rune r = Rune.forItem(node);
final Talisman t = Talisman.forName(r.name());
if (!player.getInventory().containsItem(t.getTalisman())) {
player.getPacketDispatch().sendMessage("You don't have the correct talisman to combine this rune.");
if (amountInInventory(player, t.getTalisman().getId()) == 0) {
sendMessage(player, "You don't have the correct talisman to combine this rune.");
return false;
}
talisman = t;
@ -167,23 +169,61 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
return true;
}
private static final int[][] OuraniaTable = { //https://x.com/JagexAsh/status/1312893446395506688/photo/1
/*level up to 9*/ { 2, 7, 15, 30, 60, 105, 165, 250, 400, 700,1300,2500,5000,10000},
/*level up to 19*/ { 3, 9, 21, 45, 85, 145, 225, 400,1000,2200,4600,6700,8500,10000},
/*level up to 29*/ { 8, 23, 55, 110, 220, 430, 850,1650,3250,4750,6150,7500,8800,10000},
/*level up to 39*/ { 20, 60, 120, 250, 500,1000,2000,4000,5300,6500,7600,8500,9300,10000},
/*level up to 49*/ { 40, 120, 240, 500,1000,2000,4000,5500,6500,7300,8050,8750,9400,10000},
/*level up to 59*/ { 80, 250, 600,1300,2650,4150,5250,6250,7000,7700,8350,8950,9500,10000},
/*level up to 69*/ {100, 300, 700,1500,3050,4450,5500,6450,7200,7900,8500,9050,9550,10000},
/*level up to 79*/ {200, 700,1700,3500,5000,6200,7100,7800,8300,8700,9100,9400,9700,10000},
/*level up to 89*/ {400,1000,2450,3900,5250,6300,7100,7800,8400,8900,9300,9600,9800,10000},
/*level up to 98*/ {650,1650,3300,4750,6100,7100,7800,8400,8900,9300,9600,9800,9900,10000},
/*level up to 99*/ {900,2200,3750,5200,6550,7500,8100,8600,9000,9300,9600,9800,9900,10000}
};
/**
* Method used to craft runes.
*/
private void craft() {
final Item item = new Item(getEssence().getId(), getEssenceAmount());
final Item item = getEssenceItem();
int amount = player.getInventory().getAmount(item);
if (!altar.isOurania()) {
if (altar.isOurania()) {
if (removeItem(player, item, Container.INVENTORY)) {
sendMessage(player, "You bind the temple's power into runes.");
player.incrementAttribute("/save:" + STATS_BASE + ":" + STATS_RC, amount);
int[] OuraniaValues;
if (getDynLevel(player, Skills.RUNECRAFTING) == 99) {
OuraniaValues = OuraniaTable[10];
} else {
int index = getDynLevel(player, Skills.RUNECRAFTING) / 10;
OuraniaValues = OuraniaTable[index];
}
for (int i = 0; i < amount; i++) {
int roll = RandomFunction.random(10000);
Rune rune = null;
for (int j = 0; j < 14; j++) {
if (roll < OuraniaValues[j]) {
rune = Rune.values()[13 - j];
break;
}
}
rewardXP(player, Skills.RUNECRAFTING, rune.getExperience() * 2);
addItemOrDrop(player, rune.getRune().getId(), 1);
}
}
} else {
int total = 0;
for(int j = 0; j < amount; j++) {
// since getMultiplier is stochastic, roll `amount` independent copies
total += getMultiplier();
}
Item i = new Item(rune.getRune().getId(), total);
if (player.getInventory().remove(item) && player.getInventory().hasSpaceFor(i)) {
player.getPacketDispatch().sendMessage("You bind the temple's power into " + (combination ? combo.getRune().getName().toLowerCase() : rune.getRune().getName().toLowerCase()) + "s.");
player.getInventory().add(i);
if (removeItem(player, item, Container.INVENTORY)) {
sendMessage(player, "You bind the temple's power into " + (combination ? combo.getRune().getName().toLowerCase() : rune.getRune().getName().toLowerCase()) + "s.");
addItemOrDrop(player, rune.getRune().getId(), total);
player.incrementAttribute("/save:" + STATS_BASE + ":" + STATS_RC, amount);
// Fist of guthix gloves
@ -193,7 +233,7 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
|| (altar == Altar.EARTH && inEquipment(player, Items.EARTH_RUNECRAFTING_GLOVES_12865, 1))) {
xp += xp * FOGGlovesManager.updateCharges(player, amount) / amount;
}
player.getSkills().addExperience(Skills.RUNECRAFTING, xp, true);
rewardXP(player, Skills.RUNECRAFTING, xp);
// Achievement Diary handling
// Craft some nature runes
@ -201,7 +241,7 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
player.getAchievementDiaryManager().finishTask(player, DiaryType.KARAMJA, 2, 3);
}
// Craft 196 or more air runes simultaneously
if (altar == Altar.AIR && i.getAmount() >= 196) {
if (altar == Altar.AIR && total >= 196) {
player.getAchievementDiaryManager().finishTask(player, DiaryType.FALADOR, 2, 2);
}
// Craft a water rune at the Water Altar
@ -210,58 +250,34 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
}
}
} else {
if (player.getInventory().remove(item)) {
player.getPacketDispatch().sendMessage("You bind the temple's power into runes.");
player.incrementAttribute("/save:" + STATS_BASE + ":" + STATS_RC, amount);
for (int i = 0; i < amount; i++) {
Rune rune = null;
while (rune == null) {
final Rune temp = Rune.values()[RandomFunction.random(Rune.values().length)];
if (player.getSkills().getLevel(Skills.RUNECRAFTING) >= temp.getLevel()) {
rune = temp;
} else {
if (RandomFunction.random(3) == 1) {
rune = temp;
}
}
}
player.getSkills().addExperience(Skills.RUNECRAFTING, rune.getExperience() * 2, true);
Item runeItem = rune.getRune();
player.getInventory().add(runeItem);
}
}
}
}
/**
* Method used to combine runes.
*/
private final void combine() {
private void combine() {
final Item remove = node.getName().contains("talisman") ? node : talisman != null ? talisman.getTalisman() : Talisman.forName(Rune.forItem(node).name()).getTalisman();
boolean imbued = hasSpellImbue();
if (!imbued ? player.getInventory().remove(remove) : imbued) {
if (!imbued ? removeItem(player, remove, Container.INVENTORY) : imbued) {
int amount = 0;
int essenceAmt = player.getInventory().getAmount(PURE_ESSENCE);
final Item rune = node.getName().contains("rune") ? Rune.forItem(node).getRune() : Rune.forName(Talisman.forItem(node).name()).getRune();
int runeAmt = player.getInventory().getAmount(rune);
if (essenceAmt > runeAmt) {
amount = runeAmt;
} else {
amount = essenceAmt;
}
if (player.getInventory().remove(new Item(PURE_ESSENCE.getId(), amount)) && player.getInventory().remove(new Item(rune.getId(), amount))) {
amount = Math.min(essenceAmt, runeAmt);
if (removeItem(player, new Item(PURE_ESSENCE.getId(), amount), Container.INVENTORY) && removeItem(player, new Item(rune.getId(), amount), Container.INVENTORY)) {
for (int i = 0; i < amount; i++) {
if (RandomFunction.random(1, 3) == 1 || hasBindingNecklace()) {
player.getInventory().add(new Item(combo.getRune().getId(), 1));
player.getSkills().addExperience(Skills.RUNECRAFTING, combo.getExperience(), true);
addItemOrDrop(player, combo.getRune().getId(), 1);
rewardXP(player, Skills.RUNECRAFTING, combo.getExperience());
}
}
if (hasBindingNecklace()) {
player.getEquipment().get(EquipmentContainer.SLOT_AMULET).setCharge(player.getEquipment().get(EquipmentContainer.SLOT_AMULET).getCharge() - 1);
if (1000 - player.getEquipment().get(EquipmentContainer.SLOT_AMULET).getCharge() > 14) {
player.getEquipment().remove(BINDING_NECKLACE, true);
player.getPacketDispatch().sendMessage("Your binding necklace crumbles into dust.");
if (player.getEquipment().remove(BINDING_NECKLACE, true)) {
sendMessage(player, "Your binding necklace crumbles into dust.");
}
}
}
}
@ -278,39 +294,21 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
}
/**
* Gets the essence amount.
* Gets the rune essence item.
*
* @return the amount of essence.
* @return the rune essence item.
*/
private int getEssenceAmount() {
if (altar.isOurania() && player.getInventory().containsItem(PURE_ESSENCE)) {
return player.getInventory().getAmount(PURE_ESSENCE);
private Item getEssenceItem() {
if (altar.isOurania() && amountInInventory(player, PURE_ESSENCE.getId()) > 0) {
return new Item(PURE_ESSENCE.getId(), amountInInventory(player, PURE_ESSENCE.getId()));
}
if (!rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) {
return player.getInventory().getAmount(PURE_ESSENCE);
} else if (rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) {
return player.getInventory().getAmount(PURE_ESSENCE);
} else {
return player.getInventory().getAmount(RUNE_ESSENCE);
if (!rune.isNormal() && amountInInventory(player, PURE_ESSENCE.getId()) > 0) {
return new Item(PURE_ESSENCE.getId(), amountInInventory(player, PURE_ESSENCE.getId()));
}
if (rune.isNormal() && amountInInventory(player, RUNE_ESSENCE.getId()) > 0) {
return new Item(RUNE_ESSENCE.getId(), amountInInventory(player, RUNE_ESSENCE.getId()));
}
/**
* Gets the rune essence that needs to be defined.
*
* @return the item.
*/
private Item getEssence() {
if (altar.isOurania() && player.getInventory().containsItem(PURE_ESSENCE)) {
return PURE_ESSENCE;
}
if (!rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) {
return PURE_ESSENCE;
} else if (rune.isNormal() && player.getInventory().containsItem(PURE_ESSENCE)) {
return PURE_ESSENCE;
} else {
return RUNE_ESSENCE;
}
return new Item(PURE_ESSENCE.getId(), amountInInventory(player, PURE_ESSENCE.getId()));
}
/**
@ -322,7 +320,7 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
if (altar.isOurania()) {
return 1;
}
int rcLevel = player.getSkills().getLevel(Skills.RUNECRAFTING);
int rcLevel = getDynLevel(player, Skills.RUNECRAFTING);
int runecraftingFormulaRevision = ServerConstants.RUNECRAFTING_FORMULA_REVISION;
boolean lumbridgeDiary = player.getAchievementDiaryManager().getDiary(DiaryType.LUMBRIDGE).isComplete(1);
return RuneCraftPulse.getMultiplier(rcLevel, rune, runecraftingFormulaRevision, lumbridgeDiary);
@ -337,7 +335,7 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
}
}
if(multipleLevels.length > i && runecraftingFormulaRevision >= 573) {
if (multipleLevels.length > i && runecraftingFormulaRevision >= 573) {
int a = Math.max(multipleLevels[i-1], rune.getLevel());
int b = multipleLevels[i];
if(b <= 99 || runecraftingFormulaRevision >= 581) {
@ -374,5 +372,4 @@ public final class RuneCraftPulse extends SkillPulse<Item> {
public Altar getAltar() {
return altar;
}
}