Okay, so I solved this problem now. In case anyone is looking for a way to do this, I'll briefly go over what I did.
1. I started out with rewriting the CreatureLinkingMgr to use GUID rather than entry ID (don't really get why it was entry ID to begin with ).
2. Then I added an update function to the LinkingMgr's holder class, as well as made the creature class call that function every 2.5 secs if it was a) a slave and b) had the follow flag. So the creature update function would be something like this:
Creature::Update():
if (m_creatureLinkingSlaveFollower) // AddSlaveToHolder() now returns bool if it needs regular updating
{
if (m_creatureLinkingSlaveTimer < update_diff)
{
GetMap()->GetCreatureLinkingHolder()->DoLinkingUpdateEvent(this);
m_creatureLinkingSlaveTimer = 2500;
}
else
m_creatureLinkingSlaveTimer -= update_diff;
}
3.In the CreatureLinkingMgr's update function I check if distance is further than max_dist (which is a new float added to the creature_linking_template), and if it is I use MovePoint to catch up, kind of like this:
if (!pWho || !pWhom) return;
// (left out get delta x and y for space)
float dist = sqrt(dx*dx + dy*dy);
dist = dist - pWho->GetObjectBoundingRadius() - pWhom->GetObjectBoundingRadius();
if (dist < 0.0f) dist = 0.0f;
CreatureLinkingInfo const *pInfo = sCreatureLinkingMgr.GetLinkedTriggerInformation(pWho);
if (dist < pInfo->max_dist) return;
pWho->GetMotionMaster()->MovePoint(0, pWhom->GetPositionX(), pWhom->GetPositionY(), pWhom->GetPositionZ());
4.The last touch was to get the creature to pickup the waypoint system (so it wouldn't wanna keep going back to the old WPs), the first touch was another HasInArc function with different parameters:
bool HasInArc( const float arcangle, const float posAngle ) const; // So we don't have to use a game object
5.The last part was adding some extra code to the WaypointMovementGenerator.cpp. It's split up like this:
OnArrive():
m_arrivedAsIntended = true; // We did not get interrupted by MovePoint
StartMove():
if (creature.IsLinkingFollower() && !m_arrivedAsIntended)
{
for whole i_path list:
{
// Is this WP closer than the last? And, is it also in front of us (we don't wanna be going back)
if (newDist < distance && creature.HasInArc(M_PI_F, angle))
closestWP = this one; dist = newDist;
}
i_currentNode = closestWP;
}
m_arrivedAsIntended = false;
And that is the mist of the system. It's not the most delicate system, but at least it works.
Hope this helps someone in a similar pickle.