Wilderness improvements

Added an extra option to the deep wilderness gate warning: "I wish to proceed, and don't ask me again"
Reused the same warning, with appropriate changes, for the edge/ardy levers due to the pvp mechanics
Removed the interface warning when crossing the ditch until doomsayer is implemented
Removed the inauthentic threat revenant and restricted brawler/pvp drops to revenants and chaos elemental only
Now require 100k risk to obtain the boosted deep-wildy drop rates
Hid our inauthentic mechanics behind a new server config option enhanced_deep_wilderness
This commit is contained in:
Player Name
2024-07-13 05:46:17 +00:00
committed by Ryan
parent 30f1cbf710
commit 6b152bcc8c
9 changed files with 98 additions and 228 deletions
+3
View File
@@ -333,6 +333,9 @@ class ServerConstants {
@JvmField
var RUNECRAFTING_FORMULA_REVISION = 581
@JvmField
var ENHANCED_DEEP_WILDERNESS = false
@JvmField
var STARTUP_MOMENT = Calendar.getInstance()
}
@@ -236,7 +236,7 @@ public final class SkullManager {
}
public void setDeepWilderness (boolean deepWildy) {
if(deepWildy) {
if(ServerConstants.ENHANCED_DEEP_WILDERNESS && deepWildy) {
updateDWSkullIcon();
} else {
removeDWSkullIcon();
@@ -165,6 +165,7 @@ object ServerConfigParser {
ServerConstants.FORCE_CHRISTMAS_EVENTS = data.getBoolean("world.force_christmas_randoms", false)
ServerConstants.FORCE_EASTER_EVENTS = data.getBoolean("world.force_easter_randoms", false)
ServerConstants.RUNECRAFTING_FORMULA_REVISION = data.getLong("world.runecrafting_formula_revision", 581).toInt()
ServerConstants.ENHANCED_DEEP_WILDERNESS = data.getBoolean("world.enhanced_deep_wilderness", false)
val logLevel = data.getString("server.log_level", "VERBOSE").uppercase()
ServerConstants.LOG_LEVEL = parseEnumEntry<LogLevel>(logLevel) ?: LogLevel.VERBOSE
@@ -2,7 +2,6 @@ package core.game.world.map.zone.impl;
import content.global.handlers.item.equipment.brawling_gloves.BrawlingGloves;
import content.global.skill.summoning.familiar.Familiar;
import content.region.wilderness.handlers.DeepWildyThreat;
import core.game.component.Component;
import core.game.interaction.Option;
import core.game.node.Node;
@@ -23,6 +22,7 @@ import core.game.world.map.zone.ZoneBorders;
import core.game.world.map.zone.ZoneRestriction;
import core.game.world.repository.Repository;
import core.tools.RandomFunction;
import org.rs09.consts.Items;
import org.rs09.consts.NPCs;
@@ -41,8 +41,8 @@ public final class WildernessZone extends MapZone {
*/
private static final WildernessZone INSTANCE = new WildernessZone(new ZoneBorders(2944, 3525, 3400, 3975), new ZoneBorders(3070, 9924, 3135, 10002), ZoneBorders.forRegion(12192), ZoneBorders.forRegion(12193), ZoneBorders.forRegion(11937));
public static final String WILDERNESS_PROT_ATTR = "/save:wilderness-protection-active";
public static final String WILDERNESS_HIGHER_NEXTFEE = "/save:wilderness-higher-next-fee";
public static final String WILDERNESS_PROT_ATTR = "/save:wilderness-protection-active";
public static final String WILDERNESS_HIGHER_NEXTFEE = "/save:wilderness-higher-next-fee";
/**
* The zone borders.
@@ -92,50 +92,37 @@ public final class WildernessZone extends MapZone {
}
private void rollWildernessExclusiveLoot(Entity e, Entity killer) {
if (!(killer instanceof Player)) return;
if (!(killer instanceof Player)) return;
if (!(e instanceof NPC)) return;
if (!(e.getId() == NPCs.CHAOS_ELEMENTAL_3200 || e.asNpc().getName().contains("Revenant"))) return;
boolean isDeepWildy = ((Player) killer).getSkullManager().isDeepWilderness();
boolean isRevOrCele = e.asNpc().getName().contains("Revenant") || e.getId() == NPCs.CHAOS_ELEMENTAL_3200;
boolean isSufficientRisk = ((Player) killer).getAttribute("deepwild-value-risk", 0L) > SkullManager.DEEP_WILD_DROP_RISK_THRESHOLD;
boolean isValidTarget = e instanceof NPC && ((isDeepWildy && isSufficientRisk) || isRevOrCele);
int pvpGearRate = getNewDropRate(e.asNpc().getDefinition().getCombatLevel());
boolean higherRate = ((Player) killer).getSkullManager().isDeepWilderness() && ((Player) killer).getAttribute("deepwild-value-risk", 0L) > SkullManager.DEEP_WILD_DROP_RISK_THRESHOLD;
if (higherRate) {
pvpGearRate /= 2;
}
int cEleGloveRate = 50;
int normalGloveRate = higherRate ? 100 : (int) ((1.0 / (1.0 - Math.pow(1.0 - (1.0 / (double) pvpGearRate), 16.0))) * 5.0 / 6.0);
if (isDeepWildy) {
DeepWildyThreat.adjustThreat((Player) killer, 50);
if (RandomFunction.roll(e.getId() == NPCs.CHAOS_ELEMENTAL_3200 ? cEleGloveRate : normalGloveRate)) {
byte glove = (byte) RandomFunction.random(1, 14);
Item reward = new Item(BrawlingGloves.forIndicator(glove).getId());
GroundItemManager.create(reward, e.asNpc().getDropLocation(), killer.asPlayer());
Repository.sendNews(killer.getUsername() + " has received " + reward.getName().toLowerCase() + " from a " + e.asNpc().getName() + "!");
}
for (int j : PVP_GEAR) {
boolean chance = RandomFunction.roll(pvpGearRate);
if (chance) {
Item reward;
if (j == Items.MORRIGANS_JAVELIN_13879 || j == Items.MORRIGANS_THROWING_AXE_13883) {
reward = new Item(j, RandomFunction.random(15, 50));
} else {
reward = new Item(j);
}
if (!isValidTarget) return;
int pvpGearRate = getNewDropRate(e.asNpc().getDefinition().getCombatLevel());
if (isDeepWildy && isRevOrCele)
pvpGearRate /= 2;
int cEleGloveRate = isDeepWildy ? 50 : 150;
int normalGloveRate = isDeepWildy && isRevOrCele ? 100 : (int)((1.0/(1.0-Math.pow(1.0 - (1.0/(double)pvpGearRate), 16.0))) * 5.0 / 6.0);
if (RandomFunction.roll(e.getId() == NPCs.CHAOS_ELEMENTAL_3200 ? cEleGloveRate : normalGloveRate)) {
byte glove = (byte) RandomFunction.random(1, 14);
Item reward = new Item(BrawlingGloves.forIndicator(glove).getId());
GroundItemManager.create(reward, e.asNpc().getDropLocation(), killer.asPlayer());
Repository.sendNews(killer.getUsername() + " has received " + reward.getName().toLowerCase() + " from a " + e.asNpc().getName() + "!");
if (isDeepWildy)
DeepWildyThreat.adjustThreat((Player) killer, 750);
}
for (int j : PVP_GEAR) {
boolean chance = RandomFunction.roll(pvpGearRate);
if (chance) {
Item reward;
if (j == 13879 || j == 13883) { // checks if it's a javelin or throwing axe
reward = new Item(j, RandomFunction.random(15, 50));
} else {
reward = new Item(j);
}
Repository.sendNews(killer.asPlayer().getUsername() + " has received a " + reward.getName() + " from a " + e.asNpc().getName() + "!");
GroundItemManager.create(reward, ((NPC) e).getDropLocation(), killer.asPlayer());
if (isDeepWildy)
DeepWildyThreat.adjustThreat((Player) killer, 3000);
}
}
GroundItemManager.create(reward, ((NPC) e).getDropLocation(), killer.asPlayer());
Repository.sendNews(killer.asPlayer().getUsername() + " has received a " + reward.getName() + " from a " + e.asNpc().getName() + "!");
}
}
}
/**
@@ -156,8 +143,6 @@ public final class WildernessZone extends MapZone {
return super.interact(e, target, option);
}
@Override
public boolean enter(Entity e) {
if (e instanceof Player) {
@@ -324,12 +309,12 @@ public final class WildernessZone extends MapZone {
* @return the level.
*/
public static int getWilderness(Entity e) {
int y = e.getLocation().getY();
if(6400 < y) {
return ((y - 9920) / 8) + 1;
} else {
return ((y - 3520) / 8) + 1;
}
int y = e.getLocation().getY();
if(6400 < y) {
return ((y - 9920) / 8) + 1;
} else {
return ((y - 3520) / 8) + 1;
}
}
/**