Update 9 - Travel To Quest Location: Behind the Scenes
Update 9 - Travel To Quest Location: Behind the Scenes
By: Nathan "NPComplete" Partlan
Hello, community! You probably don't remember me, but I posted an introduction a few months back. Since the release of RoR, I have been hard at work on new features and fixes for you guys for Update 9. I'd like to tell you about one of them, the new “Travel to Quest Objective” feature, today. I hope to give you some insight into what goes into this sort of thing from a programmer's perspective, but I have to admit that I might just want to tell you about it because I thought it was fun to make.
Let's start with an explanation of what this cool new thing is and how you can use it:
There is a new little icon (a little silver circle with an arrow on it) in the Quest Tracker next to quests that are currently eligible for travelling immediately to their current objective. This will be available for most (I'll explain why not all in a moment) quest objectives that require the player to simply talk to a specific NPC. This is primarily designed to make it easy to return to a quest-giver to turn in a quest, but it can also be useful in the middle of certain quests requiring a long journey just to talk to someone.
If you click on this new icon, you will see a confirmation dialog (to prevent accidental usage). You will see that you can immediately travel to the NPC for one "Traveller's Writ." These are a Barter Wallet currency that you can purchase from the LOTRO store.
When you click "OK," you will instantly teleport next to the NPC in question, assuming no last-second problems arise (such as being too close to the NPC already). Don't worry - if there is a problem, you will not be charged a Traveller's Writ. Due to some technical challenges, which I'll explain below, you may be transported to the exact location of the NPC for certain cases, or nearby but slightly further away than normal.
You can't use this feature in combat, nor can you use it while inside an instance, in the Ettenmoors, or during stable mount travel. It may also be disabled now or in the future for some quests where it would let you skip important story or fighting encounters.
Although I am not a designer, I'd also like tell you why I've been excited to work on this stuff and what I think is cool about it. I am, unfortunately, a busy player without any level-capped characters. I want to get at least one of my characters through some of the repetition of running back along the same route to a quest giver, so that I can experience more of the story and cool new content. I still want to see the world, but there are only so many times I can run past a given field before it gets a bit tedious. This new travel method will allow me to see the world when I want to, but also to skip repeating the same journey too many times. For long-standing players with several level-capped characters, I expect this will also make it easier to try out a new class or race.
Now for the technical part.
In addition to wanting to use this myself, I also enjoyed working on this feature because it presented some very cool technical challenges. The basic feature seems simple: find the NPC in the world, and then teleport the player to that spot. There is a bunch of hidden complexity there, however. With thousands of quests to automatically work with, we couldn't possibly anticipate every situation perfectly. We needed to make ways to turn the system off for certain quests – even at a moment's notice if a problem is found after the system is deployed. We needed to anticipate as many problems as possible, so I spent time ensuring that problem quest types, such as instance quests and quests with multiple objective locations, would be disabled from using this system, among several other interesting little checks and considerations.
The first real challenge, though, is probably not obvious unless you've worked with MMO coding before. If no other players are near a quest giver, the NPC's area may not even be loaded on the server! After all, why keep an area loaded if there are no players around to use it? This makes it difficult for the program to understand where to teleport your character to; the area in question may not exist.
We do, however, have Quest Guide. It knows the location we use to display the quest rings and distance indicators that you use every day. For quests with only one Quest Guide location for a given NPC, we can assume the NPC is at least very near that point. This turns out to work very well in almost every case, except for NPCs that have long patrol routes.
Once we had the basic feature working, we got to do some polish. I ensured that the buttons would be greyed out when you're in combat, using stable travel, in an instance, or when you already have the panel open to another quest's objective. In each little special case, I got to learn more about or innovate on how to interface with the related systems. I added more error-checking and player-facing notices, and we spiffed up the UI. We also ran into and fixed some fun race conditions with trying to execute multiple different types of travel at once.
The coolest part, I think, was when we realized that it seemed a bit silly to be teleported to the exact position of the NPC each time. We decided to try to avoid doing this when possible. It would be nice, we thought, to put you next to the NPC. But what about quests where the quest-giver is mining from a wall, standing on the edge of a cliff, or locked in a prison cell? Each of these situations provides different challenges to placing your character in a reasonable position. In fact, it would have been easier to just give up before we even started. But these sorts of problems are what we engineers love to think about before we go to sleep at night and make us want to go to work the next day, so... we couldn't resist.
To combat these issues, we got creative. First, we had to ensure that the area was loaded by teleporting you to the NPC's location. Then we could make a best effort to move you a short distance away, use the physics system and line-of-sight checks to ensure that you would land within view of the NPC and standing on a walkable location, and leave you at the NPC's location if all else failed. In most cases, this turned out to work nicely! In a few others, you still end up at the NPC's exact spot. In a couple more, we still had to turn off the feature for a specific quest objective. Now you know why you might not always see the option to travel to every NPC.
I suppose this is all a bit hard to grasp without seeing the details yourself, and it may not be interesting to most of you. If it is, maybe you should consider making games!
Enjoy travelling to your quest objectives, and let me know if you have any questions or comments! Although I can't promise any specific suggestion will be implemented (remember that your opinion may not be shared by everyone, and certain things just aren't feasible in the time we have), I know the designers want to iterate on everything until it's awesome.