diff --git a/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java b/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java index efee40538..507ef5cad 100644 --- a/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java +++ b/Server/src/main/java/core/game/world/map/zone/impl/WildernessZone.java @@ -24,6 +24,7 @@ import core.game.world.map.zone.MapZone; import core.game.world.map.zone.RegionZone; import core.game.world.map.zone.ZoneBorders; import core.tools.RandomFunction; +import org.rs09.consts.NPCs; import rs09.game.system.config.NPCConfigParser; import rs09.game.world.GameWorld; import rs09.game.world.repository.Repository; @@ -160,17 +161,32 @@ public final class WildernessZone extends MapZone { player.getInterfaceManager().open(new Component(153)); } } - if (e instanceof NPC && killer instanceof Player && (e.asNpc().getName().contains("Revenant") || e.asNpc().getName().equals("Chaos elemental"))) { + + //Roll for PVP gear and Brawling Gloves from revenants + if (e instanceof NPC && killer instanceof Player && (e.asNpc().getName().contains("Revenant") || e.getId() == NPCs.CHAOS_ELEMENTAL_3200)) { + + boolean gloveDrop = e.getId() == NPCs.CHAOS_ELEMENTAL_3200 ? RandomFunction.roll(75) : RandomFunction.roll(100); + if (gloveDrop) { + byte glove = (byte) RandomFunction.random(1, 13); + 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() + "!"); + } + e.asNpc().getDefinition().getDropTables().drop(e.asNpc(), killer); + if (((NPC) e).getTask() != null && ((Player) killer).getSlayer().getTask() == e.asNpc().getTask()) { + ((Player) killer).getSlayer().finalizeDeath(killer.asPlayer(), e.asNpc()); + } + int combatLevel = e.asNpc().getDefinition().getCombatLevel(); int dropRate = getNewDropRate(combatLevel); - for (int i = 0; i < PVP_GEAR.length; i++) { - boolean chance = RandomFunction.random(dropRate) == dropRate / 2; + for (int j : PVP_GEAR) { + boolean chance = RandomFunction.roll(dropRate); if (chance) { Item reward; - if (PVP_GEAR[i] == 13879 || PVP_GEAR[i] == 13883) { // checks if it's a javelin or throwing axe - reward = new Item(PVP_GEAR[i], RandomFunction.random(15, 50)); + 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(PVP_GEAR[i]); + 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()); @@ -178,22 +194,6 @@ public final class WildernessZone extends MapZone { } } } - if (killer.isPlayer()) { - if (e instanceof NPC) { - boolean gloveDrop = RandomFunction.random(1, 100) == 54; - if (gloveDrop) { - byte glove = (byte) RandomFunction.random(1, 13); - 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() + "!"); - } - e.asNpc().getDefinition().getDropTables().drop(e.asNpc(), killer); - if (((NPC) e).getTask() != null && killer instanceof Player && ((Player) killer).getSlayer().getTask() == e.asNpc().getTask()) { - ((Player) killer).getSlayer().finalizeDeath(killer.asPlayer(), e.asNpc()); - } - } - - } if (e instanceof NPC) { e.asNpc().setRespawnTick(GameWorld.getTicks() + e.asNpc().getDefinition().getConfiguration(NPCConfigParser.RESPAWN_DELAY, 17)); diff --git a/Server/src/main/java/core/tools/RandomFunction.java b/Server/src/main/java/core/tools/RandomFunction.java index 28c5e0df0..226046ee9 100644 --- a/Server/src/main/java/core/tools/RandomFunction.java +++ b/Server/src/main/java/core/tools/RandomFunction.java @@ -44,6 +44,15 @@ public class RandomFunction { return Math.min(a, b) + (n == 0 ? 0 : random(n)); } + /** + * Method to roll for a random 1/X chance + * @param chance the 1/chance rate for the roll to succeed + * @return true if you hit the roll, false otherwise + */ + public static boolean roll(int chance){ + return random(chance) == chance / 2; + } + /** * Calculates the chance of succeeding at a skilling event * @param low - Success chance at level 1