Update. So while I didn't do any more than a debug print, I tried my hand at line of sight calculation today. What I'm doing is tracing a line segment from NPC eye position to player eye position, then checking for mesh triangle intersection at a distance of less than ray length. If any triangle intersects ray like that, the check ends early with no line of sight. It's easy enough, I just need to take it a step further and use the level geometry chunking system with it. Right now I'm calculating distance between PC and NPC, seeing if it's less than LOS range, then checking against every tri in the map. Getting about ~500-600 microseconds for one LOS check. Definitely going to need all the optimization I can get though, considering it will be done server-side, for all PC-NPC interactions.
Next up: swimming. The plan so far is to use the water as a collision volume, which you can see in the 4th pic. Basically a bounding box encompasses the level geometry that should be underwater. For some zones, this may be one single box that extends from some z-level downwards - think islands sticking up out of a flat ocean. Different movement rules and physics will apply whether the player's collision capsule's center is in the water volume or not. Out of water volume, normal run in 2 dimensions + jump, crouch, climb, etc. In water volume, can no longer crouch or jump, but can move in all directions. Falling into a water volume from above will have the player fall normally until their center intersects the water volume where they will then decelerate quickly. Standing in shallow water, where the player center is out of the water volume, will allow movement like normal. I will also be using the player's eye position to determine the render mode. If the player's eye point is inside the water volume, the ambient lighting will be changed to match that of the water volume (probably dim and blue/green), and the distance fog will be made much more aggressive (reduced visibility). I'd also like to blend a cube-mapped animated caustics texture over meshes under the water if I can, because that looks cool. Torches, lanterns, etc. will not work underwater but other magical sources of light will. The collision check for whether one is in water or not will probably be a naive approach (check every volume against player center and eyes every frame) since point -> bounding box collision is cheap, and I can't imagine having more than a handful of separate water volumes per zone. 5th pic outlines some of the plan as it stands. I still haven't come up with an easy solution for getting the player up out of the water where it meets land at a sharp angle. In real life, you just grab on and hoist yourself up on out, like getting out of a pool, but we're working with capsule collisions here. Maybe on collision I can shoot a ray from player center point one player width long and if it doesn't hit terrain or the water volume, allow movement up onto the colliding mesh. That or put a short invisible "ladder" volume along those edges, which come to think of it, act a lot like water volumes: while colliding, you can look up and push forward to move upwards. Got to experiment some.