Avatar movement is done by a click&wait&drag&drop operation (drag a Dweller onto another room). Internally, a waypoint array of Vec3 is being calculated “on drop” and submitted to the entity for pathed walking.
For pathfinding, I used a stripped-down A* variant, running in the main thread. As avatar numbers and positions match the underlying grid, the pathfinding is simply using grid elements.
Actually, the a.m. waypoint array could be converted into a more general “action system”, where different actions would be calculated at path creation time. Like, “walk to…”, “activate elevator lights…”, etc. This way, an action list would be given to each avatar, which takes then care about trigger time and execution. Actually, I’d prefer this over lots of independent volume triggers in the scene.