hi, here is a code for upgrading routine in follow mode. I meant NPC's are being lost after hero was climbing. Using this code NPc's use the ladders while they follow a hero, but can not climb on the top of objects (rocks/houses etc.). Well hostile NPCs are climbing when they pursue us.

Code:
func void ZS_FollowPC()
{
    PrintDebugNpc(PD_TA_FRAME,"ZS_FollowPC");
    Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnemy);
    Npc_PercEnable(self,PERC_ASSESSPLAYER,B_FollowPC_AssessSC);
    Npc_SetPercTime(self,1);
    self.senses = SENSE_SEE | SENSE_HEAR | SENSE_SMELL;
    Npc_PercEnable(self,PERC_ASSESSDAMAGE,ZS_ReactToDamage);
    Npc_PercEnable(self,PERC_ASSESSCASTER,B_AssessCaster);
    Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagic);
    Npc_PercEnable(self,PERC_ASSESSMURDER,ZS_AssessMurder);
    Npc_PercEnable(self,PERC_ASSESSDEFEAT,ZS_AssessDefeat);
    Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_AssessFightSound);
    Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk);
    Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
    self.aivar[AIV_ITEMFREQ] = 0;
};

func int ZS_FollowPC_Loop()
{
    if(C_BodyStateContains(hero,BS_CLIMB) && (self.aivar[AIV_ITEMFREQ] == 0))
    {
        hero.wp = Npc_GetNearestWP(hero);
        self.aivar[AIV_ITEMFREQ] = 1;
        AI_SetWalkMode(self,NPC_RUN);
        AI_GotoWP(self,hero.wp);
        return LOOP_CONTINUE;
    }
    else if(C_BodyStateContains(hero,BS_CLIMB) && (self.aivar[AIV_ITEMFREQ] == 1))
    {
        AI_Wait(self,0.5);
        return LOOP_CONTINUE;
    }
    else if(!C_BodyStateContains(hero,BS_CLIMB) && (self.aivar[AIV_ITEMFREQ] == 1))
    {
        hero.wp = Npc_GetNearestWP(hero);
        self.aivar[AIV_ITEMFREQ] = 2;
        AI_StopLookAt(self);
        AI_SetWalkMode(self,NPC_RUN);
        AI_GotoWP(self,hero.wp);
        return LOOP_CONTINUE;
    }
    else if(self.aivar[AIV_ITEMFREQ] == 2)
    {
        if(C_BodyStateContains(hero,BS_CLIMB))
        {
            self.aivar[AIV_ITEMFREQ] = 0;
            return LOOP_CONTINUE;
        }
        else if(Npc_GetDistToNpc(self,hero) > 400)
        {
            self.aivar[AIV_ITEMFREQ] = 1;
            return LOOP_CONTINUE;
        };
        self.aivar[AIV_ITEMFREQ] = 0;
    };
    if((self.id == 524) && !self.aivar[AIV_PARTYMEMBER])//vlk_524_dusty
    {
        return LOOP_END;
    };
    if(C_BodyStateContains(hero,BS_WALK))
    {
        AI_SetWalkMode(self,NPC_WALK);
    }
    else if(!C_BodyStateContains(self,BS_SWIM))
    {
        AI_SetWalkMode(self,NPC_RUN);
    };
    if(Npc_GetDistToNpc(self,hero) > 300)
    {
        AI_GotoNpc(self,hero);
    }
    else if(!C_BodyStateContains(self,BS_CLIMB))
    {
        B_SmartTurnToNpc(self,hero);
    };
    return LOOP_CONTINUE;
};

func void ZS_FollowPC_End()
{
    PrintDebugNpc(PD_TA_FRAME,"ZS_FollowPC_End");
    self.senses = hero.senses;
    self.aivar[AIV_ITEMFREQ] = 0;
};

func void B_FollowPC_AssessSC()
{
    PrintDebugNpc(PD_TA_FRAME,"B_FollowPC_AssessSC");
    if((Npc_GetDistToNpc(self,hero) < 300) && !C_BodyStateContains(self,BS_CLIMB) && !self.aivar[AIV_ITEMFREQ])
    {
        PrintDebugNpc(PD_TA_CHECK,"...SC-Meister jetzt nahe genug!");
        B_FullStop(self);
    };
    if(Npc_CheckInfo(self,1))
    {
        PrintDebugNpc(PD_TA_CHECK,"...wichtige Info zu vergeben!");
        if(!hero.aivar[AIV_INVINCIBLE])
        {
            hero.aivar[AIV_IMPORTANT] = TRUE;
            B_FullStop(other);
            B_FullStop(self);
        };
        AI_StartState(self,ZS_Talk,0,"");
        return;
    };
};