Jump to content

How To Easily Obtain The "well Read" Achievement In About 30 Minutes. (Alliance Only)


Recommended Posts

Posted (edited)

Preparation

Technically, the only requirement is that you are level 33 so that you are able enter Scholomance. However, I highly recommend that you are at least level 60 for the following reasons:

 

- You can buy a flying mount which will save a lot of time and if not, you will at least have access to all the flight paths, so travel by foot will be minimal.

- You should be able to solo Scholomance. Otherwise, you will have to find a group to do it with.

 

 

 

A few tips before you get started:

 

 

- An addon that navigates you to waypoints is recommended, such as Carbonite, TomTom etc.

- Click on the links to see a map of where the book is if the description (in italics) is not enough to help you find the book.

- You do not have to read through the entire book, you only have to right click on it and see the first page.

- N = north, E = East, S = south and W = West. They will usually refer to a side or corner of the room you're in.

- Spend your time flying between locations reading up on the descriptions of the books you're going to find in the next location so that you don't have to keep switching windows.

 

 

 

Disclaimer: The time it will take you to find every book will vary depending on how fast you travel around and how fast you can find the book once you arrive. You will not complete it in under 30 minutes if this is your first time. Instead, it will probably take you about 45 minutes to an hour. However, I have timed myself doing the course with artisan flying and have completed it in only 25 minutes on my second try (not including time spent waiting for boat or time spent on the boot, about 4 minutes).

 

 

Now fly to Booty Bay, set your stopwatch and let's get started!

 

 

Booty Bay

 

1. Go to the Salty Tailor Tavern, the building at the south end of Booty Bay with the boat sticking out.

Sunwell - The Fall of Quel'Thalas (41, 74) 2nd floor.

 

2. Get to the room above “Sea Wolf” Mackinley’s room, past the shark, on the right after leaving the inn. Either fly up or go around.

The Sentinels and the Long Vigil (42.2, 73.7) On the bedside table

 

3. Now to Auctioneer Kresky. He’s down two sets of stairs from “Sea Wolf” Mackinley’s room.

Empires' Fall, The Twin Empires, Wrath of the Soulflayer (42.1, 73.8). S corner in an empty bookcase

The Scourge of Lordaeron (41, 73) W corner in an empty bookcase.

 

 

Kingdom of Stormwind

 

NOTE: If you did enough quests to have Sentinel Hill on fire, the book in Westfall is phased. You have to go to the one in Thelsamar, Loch Modan (37,47). It can be found on the night stand behind Karm Ironquill who is in the basement near the mining trainer. I suggest getting it after you get the books in Ironforge.

 

1. Fly to Sentinel Hill and go to in the inn at the SW end of the town.

The Last Guardian (52.6, 53.1) NE side on a table between beds.

 

2. Fly to Duskwood and go in the inn N of the fountain.

Kil'jaeden and the Shadow Pact (74, 45) Upstairs in the first room on a desk to the right of the bed

The Founding of Quel'Thalas (73.7, 43.1) Upstairs in the second room on a table.

 

3. Fly to Eastvale Logging Camp in Elwynn Forest.

Lethargy of the Orcs (84, 69) SE end of village by marshall haggard, upstairs on table in center of room.

 

4. Go west to the Tower of Azora.

Rise of the Blood Elves (64, 69) Top floor, NW on desk

 

 

 

Stormwind City

 

1. Get to Stormwind and go to the Stormwind Library. It’s in the northeastern end of SW Keep. Enter and turn right. The books are written in anti-clockwise order around the room.

The Kaldorei and the Well of Eternity (84, 25) On the pillar to the right of door as you enter

Aftermath of the Second War, The Guardians of Tirisfal, The Alliance of Lordaeron (85, 26) S corner on a table

The New Horde (86, 25) E corner on a pillar left of Harrison Jones

Aegwymm and the Dragon Hunt (85, 23) NE corner left on the central bookcase

The War of the Ancients, The World Tree and the Emerald Dream (85, 23) N corner on a table

Beyond the Dark Portal (84, 24) W corner on a chair.

 

2. Go to the Battlemaster Room, SE of King Varian.

War of the Spider, The Dark Portal and the Fall of Stormwind (86, 35) Center of room around the map

 

3. Head to the Mage Quarter, face the stockades, turn left, turn left again past Lisa McKeever and enter the building.

Archimonde's Return and the Flight to Kalimdor (51,73) Center of room on table

Mount Hyjal and Illidan's Gift (51, 74) Center of room on table.

 

 

Darnassus

 

1.Take the boat in SW Harbor to Teldrassil and take the portal into Darnassus. Go to the center building of the 5 buildings on the outer layer of the Trademan’s Terrace.

The Betrayer Ascendant (61,74) On the right on a closet just as you enter

 

2. Now go to the Cenarion enclave and go inside the tree.

Exile of the High Elves (39,39) Behind Erion Shadewhisper at the end of the cave.

 

 

 

Ironforge

 

1.Take the boat or hearth back to SW. Then fly to Ironforge or take the Deeprun Tram (it's usually faster, espacially if you don't have artisan flying). Go to the the circular room at the end the Hall of Explorers.

Ironforge - the Awakening of the Dwarves, War of the Three Hammers (74, 9) NW on table.

 

2. Arathor and the Troll Wars (77, 09) NE on table

 

3. Rise of the Horde, Civil War in the Plaguelands (77, 13) SE on table

 

4. The Battle of Grim Batol, The Old Gods and the Ordering of Azeroth, Charge of the Dragonflights (75, 10) Center of room on table

 

 

 

Scholomace

 

1. Finally, fly to Scholomance. Go straight ahead into the large room called The Reliquary.

The Seven Kingdoms (62, 35) At bottom of stairs on a table after passing through the first Iron Gate and turning left.

 

2. Icecrown and the Frozen Throne (72, 40) To the right of The Seven Kingdoms, in front of the first big bookcase

 

3. Sargeras and the Betrayal (84.6, 43.9) NE next a big bookcase

 

4. Kel'Thuzad and the Forming of the Scourge, The Birth of the Lich King (76.61, 67.80) SE in front of big bookcase

 

5. The Lich King Triumphant (70.9, 68.7) S next to a big bookcase

 

6. Go back to the beginning and jump off the bridge. Beware, there are many mobs waiting for you!

The Invasion of Draenor (55.7, 41.4) NE of room after jumping down

 

7. Go up the stairs, go straight and read the final book!

Old Hatreds - The Colonization of Kalimdor (31.6,53.3) Just to the left of the doorway, W side of room.

 

 

 

 

CONGRATULATIONS ON YOUR NEW ACHIEVEMENT!!!

Edited by Amnesty

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Posts

    • what pack you use  send me on discord for it
    • package custom.events.RandomZoneEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ScheduledFuture; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.l2jmobius.commons.threads.ThreadPool; import org.l2jmobius.commons.time.SchedulingPattern; import org.l2jmobius.commons.time.TimeUtil; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.gameserver.managers.ZoneManager; import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.quest.Event; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.model.zone.ZoneType; import org.l2jmobius.gameserver.model.zone.type.RandomZone; import org.l2jmobius.gameserver.util.Broadcast; /** * Random Zone Event - Activates one random PvP zone temporarily. No modifica la clase de la zona: usa flags PvP en runtime. * @author Juan */ public class RandomZoneEvent extends Event { private static final String CONFIG_FILE = "data/scripts/custom/events/RandomZoneEvent/config.xml"; private static int EVENT_DURATION_MINUTES = 15; private static boolean _isActive = false; private ScheduledFuture<?> _eventTask = null; private final List<ZoneType> _availableZones = new ArrayList<>(); private ZoneType _activeZone = null; public RandomZoneEvent() { loadConfig(); loadZones(); registerZoneListeners(); } /** * Registra listeners a TODAS LAS ZONAS random */ private void registerZoneListeners() { for (ZoneType zone : _availableZones) { addEnterZoneId(zone.getId()); addExitZoneId(zone.getId()); LOGGER.info("[RandomZoneEvent] Registered listener for zone: " + zone.getName()); } } private void loadConfig() { new IXmlReader() { @Override public void load() { parseDatapackFile(CONFIG_FILE); } @Override public void parseDocument(Document doc, File file) { forEach(doc, "event", eventNode -> { final StatSet att = new StatSet(parseAttributes(eventNode)); final String name = att.getString("name"); for (Node node = eventNode.getFirstChild(); node != null; node = node.getNextSibling()) { if ("schedule".equals(node.getNodeName())) { final StatSet attributes = new StatSet(parseAttributes(node)); final String pattern = attributes.getString("pattern"); final SchedulingPattern schedulingPattern = new SchedulingPattern(pattern); final StatSet params = new StatSet(); params.set("Name", name); params.set("SchedulingPattern", pattern); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer("Schedule_" + name, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Event " + name + " scheduled at " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } }); } }.load(); } private void loadZones() { for (ZoneType zone : ZoneManager.getInstance().getAllZones(RandomZone.class)) { if ((zone.getName() != null) && zone.getName().toLowerCase().startsWith("random_zone")) { _availableZones.add(zone); LOGGER.info("[RandomZoneEvent] Loaded zone: " + zone.getName() + " (id=" + zone.getId() + ")"); } } LOGGER.info("[RandomZoneEvent] Total random zones loaded: " + _availableZones.size()); } @Override public void onTimerEvent(String event, StatSet params, Npc npc, Player player) { if (event.startsWith("Schedule_")) { eventStart(null); final SchedulingPattern schedulingPattern = new SchedulingPattern(params.getString("SchedulingPattern")); final long delay = schedulingPattern.getDelayToNextFromNow(); getTimers().addTimer(event, params, delay + 5000, null, null); LOGGER.info("[RandomZoneEvent] Rescheduled for " + TimeUtil.getDateTimeString(System.currentTimeMillis() + delay)); } } @Override public boolean eventStart(Player eventMaker) { if (_isActive) { if (eventMaker != null) { eventMaker.sendMessage("RandomZoneEvent already active."); } return false; } if (_availableZones.isEmpty()) { Broadcast.toAllOnlinePlayers("[RandomZoneEvent] No zones configured."); return false; } _isActive = true; Broadcast.toAllOnlinePlayers("⚔️ Random Zone Event has started!"); _eventTask = ThreadPool.schedule(this::activateRandomZone, 5_000); return true; } private void activateRandomZone() { _activeZone = _availableZones.get(new Random().nextInt(_availableZones.size())); _activeZone.setEnabled(true); Broadcast.toAllOnlinePlayers("🔥 Random Zone Event: " + _activeZone.getName() + " is now PvP for " + EVENT_DURATION_MINUTES + " minutes!"); _eventTask = ThreadPool.schedule(this::eventStop, EVENT_DURATION_MINUTES * 60 * 1000L); } @Override public boolean eventStop() { if (!_isActive) { return false; } _isActive = false; if (_eventTask != null) { _eventTask.cancel(true); _eventTask = null; } if (_activeZone != null) { _activeZone.setEnabled(false); Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended. " + _activeZone.getName() + " is back to normal."); _activeZone = null; } else { Broadcast.toAllOnlinePlayers("🏁 Random Zone Event ended."); } return true; } @Override public void onEnterZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, true); if (creature.isPlayer()) { creature.sendMessage("Esta zona está en modo PvP temporalmente."); } } } @Override public void onExitZone(Creature creature, ZoneType zone) { if (!_isActive || (_activeZone == null)) { return; } if ((zone == _activeZone) && creature.isPlayable()) { creature.setInsideZone(ZoneId.PVP, false); if (creature.isPlayer()) { creature.sendMessage("Abandonaste la zona PvP temporal."); } } } @Override public boolean eventBypass(Player player, String bypass) { return true; } @Override public String onEvent(String event, Npc npc, Player player) { return super.onEvent(event, npc, player); } @Override public String onFirstTalk(Npc npc, Player player) { return null; } public static void main(String[] args) { new RandomZoneEvent(); } } i have this but its not working
    • ZonePvPSpawnBossRadio=0 ZonePvPSpawnBossBarakiel=0 at the Customs.ini in L2Server folder. Im prety sure this is it because i had the same problem with you in cruma 1 floor for example and i couldn't fix it but i fixed it finally by changing these 2 lines
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock