private void SendOnTrackedObjectChange(string tracker, string trackedName)
    {
        //get location type
        switch (trackedObjects[tracker].type)
        {
        case LOCATION_TYPE.SHIP:
            List <int>    sentToIDs = new List <int>();
            DB_Ship       ship      = mdb.FetchShipByName(tracker);
            TrackedObject tracked   = trackedObjects[trackedName];
            foreach (DB_Worker worker in mdb.FetchWorkersByShip(ship))
            {
                DB_Player player = mdb.FetchPlayerByID(worker.owner.Id.AsObjectId);
                //only send if the player has not already been sent to
                if (!sentToIDs.Contains(player.ActiveConnectionID))
                {
                    SendClient(player.ActiveConnectionID, player.ActiveHostID, new Net_OnTrackedObjectChange(trackedName, tracked.pos.x, tracked.pos.y, tracked.vel.x, tracked.vel.y));
                    sentToIDs.Add(player.ActiveConnectionID);
                }
            }
            break;

        case LOCATION_TYPE.COLONY:
        case LOCATION_TYPE.ASTEROID:
            Debug.Log("not implemented");
            break;

        case LOCATION_TYPE.NONE:
        default:
            Debug.Log(string.Format("[Sector Server]: Unexpected tracked location type ({0}).", trackedObjects[tracker].type));
            break;
        }
    }