This fixes a crash that occurs on systems with no Direct3D device
available. The device selector returns a NULL string, which is then
strstr'ed for some ancient nvidia card. For now, let's wrap that in a NULL
check. Eventually, when we scrub plClient.cpp and winmain.cpp, that hack
should just be dropped.
pfCrashHandler includes a client that watches plClient for crashes. When
it detects a crash, it lets the plCrashSrv (plCrashHandler.exe) know about
it. We then produce a mninidump, then signal the client that it's OK to
show a crash dialog. See http://www.nynaeve.net/?p=128 for a good
explanation of why I split the crash logic into another process.
IP addresses don't need to be unicode.
pnUtAddr is still around until we replace all NetAddress uses with
plNetAddress (they are typedef'ed to each other right now).
Update the Windows 7 taskbarlist progress bar on plOperationProgress
callbacks. It's not totally nesecary, but it adds a nice bit of polish to
the experience.
This should work because we only ever call Wait() once. It doesn't fully
behave like Win32's manual reset events though, so if we had a more
complex usage that depended on the event remaining signalled, we'd have
a problem.
Prevents cheating with time based puzzles (pellets) and ensures the KI time
stays somewhat correct. The server time will be reset on the plNetMessage
received after the user changes their system clock. That might take a bit,
but it's better than nothing.
It turns out that eap (I know it was him... look at those weird comments
between the functions) was calling plClient::IDraw for every KeyedObject we
loaded in order to update the progress bar. For some reason, some stooge
added a framerate limit to the MAIN DRAW LOOP instead of this function.
*Sigh*. Either way, the framerate limit is a HACK. We should really be
loading resources in another thread.
Rearrange some things so such that low-level CoreLib headers aren't quite
so crazy. For higher level stuff, you still need to include the
appropriate header.