Thread: NPC Spawn Issue: No Pixie Tricksters in Gfay
View Single Post
  #5  
Old 02-22-2010, 03:04 PM
nilbog nilbog is offline
Project Manager

nilbog's Avatar

Join Date: Oct 2009
Posts: 14,724
Default

Quote:
In *many* zones, mobs don't path quite the same as they did on live. That's not so much a bug, really, as the reality of trying to rebuild countless pathing nodes from the limited sources available.
There's a new method to pathing.. where I could choose a large enough area for them to spawn, and it would include specified x/y/z coordinates of the zone. The pathing can be random though, which might even be better in cases like this.

Will definitely be experimenting with this, so newbie zones and large areas will look better in the future.



Very nice plugin from eqemulator.net written by Trevius. For those who care about scripts...

Code:
#NOTE: These functions require the globals.pl file for use of the val() plugin

#Usage: plugin::RandomRoam(MaxXVariance, MaxYVariance);

sub RandomRoam {

    my $npc = plugin::val('$npc');
    my $MaxXVariance = $_[0];
    my $MaxYVariance = $_[1];
    
    # Don't try to roam if already engaged in combat!
    if ($npc->IsEngaged() != 1) {

        #Get needed Locs
        my $CurX = $npc->GetX();
        my $CurY = $npc->GetY();
        #my $CurZ = $npc->GetZ();    #Not currently required by this plugin
        my $OrigX = $npc->GetSpawnPointX();
        my $OrigY = $npc->GetSpawnPointY();
        my $OrigZ = $npc->GetSpawnPointZ();
        my $GuardX = $npc->GetGuardPointX();
        my $GuardY = $npc->GetGuardPointY();

        if ($CurX == $GuardX && $CurY == $GuardY) {    #If the NPC has finished walking to the previous given Loc

            #Get a random X and Y within the set range
            my $RandomX = int(rand($MaxXVariance - 1)) + 1;
            my $RandomY = int(rand($MaxYVariance - 1)) + 1;
            my $PosX = $OrigX + $RandomX;
            my $PosY = $OrigY + $RandomY;
            my $NegX = $OrigX - $RandomX;
            my $NegY = $OrigY - $RandomY;
            my $NewX = quest::ChooseRandom($PosX, $NegX);
            my $NewY = quest::ChooseRandom($PosY, $NegY);
            
            #Check for LoS and Z issues before moving to the new Loc
            my $NewZ = $npc->FindGroundZ($NewX,$NewY, 5) + 1;    #Add 1 to the new Z to prevent hopping issue when they arrive
            if ($NewZ > -999999 && $OrigZ > ($NewZ - 16) && $OrigZ < ($NewZ + 14)) {
                my $LoS_Check = $npc->CheckLoSToLoc($NewX, $NewY, $NewZ, 5);
                #Check LoS to the new random Loc
                if ($LoS_Check) {
                    quest::moveto($NewX, $NewY, $NewZ, -1, 1);
                }
            }
        }
    }
}

#Usage: plugin::StraightPath(MaxXVariance, MaxYVariance);

sub StraightPath {
    
    my $npc = plugin::val('$npc');
    my $MaxXVariance = $_[0];
    my $MaxYVariance = $_[1];
    
    # Don't try to roam if already engaged in combat!
    if ($npc->IsEngaged() != 1) {

        #Get needed Locs
        my $CurX = $npc->GetX();
        my $CurY = $npc->GetY();
        #my $CurZ = $npc->GetZ();    #Not currently required by this plugin
        my $OrigX = $npc->GetSpawnPointX();
        my $OrigY = $npc->GetSpawnPointY();
        my $OrigZ = $npc->GetSpawnPointZ();
        my $GuardX = $npc->GetGuardPointX();
        my $GuardY = $npc->GetGuardPointY();

        if ($CurX == $GuardX && $CurY == $GuardY) {    #If the NPC has finished walking to the previous given Loc

            #Get a random X and Y within the set range
            my $RandomX = int(rand($MaxXVariance - 1)) + 1;
            my $RandomY = int(rand($MaxYVariance - 1)) + 1;
            my $PosX = $OrigX + $RandomX;
            my $PosY = $OrigY + $RandomY;
            my $NegX = $OrigX - $RandomX;
            my $NegY = $OrigY - $RandomY;
            my $NewX = quest::ChooseRandom($PosX, $NegX, $OrigX, $OrigX);
            
            if ($NewX == $OrigX) {    # If we are using the orignal X, then chose a random Y to go to
                if ($CurX == $OrigX) {    # If they are moving on the same Axis they are currently on
                    my $NewY = quest::ChooseRandom($PosY, $NegY);
                    #Check for LoS and Z issues before moving to the new Loc
                    my $NewZ = $npc->FindGroundZ($NewX, $NewY, 5) + 1;    #Add 1 to the new Z to prevent hopping issue when they arrive
                    if ($NewZ > -999999 && $OrigZ > ($NewZ - 16) && $OrigZ < ($NewZ + 14)) {
                        if ($NewY > $OrigY) {    # Checking which direction we are moving in
                            # Adjust the LoS Check to check further than how far we are traveling so we stay away from walls
                            my $LoS_Check = $npc->CheckLoSToLoc($NewX, $NewY + 2, $NewZ, 5);
                            #Check LoS to the new random Loc
                            if ($LoS_Check) {
                                quest::moveto($NewX, $NewY, $NewZ, -1, 1);
                            }
                        }
                        else {
                            # Adjust the LoS Check to check further than how far we are traveling so we stay away from walls
                            my $LoS_Check = $npc->CheckLoSToLoc($NewX, $NewY - 2, $NewZ, 5);
                            #Check LoS to the new random Loc
                            if ($LoS_Check) {
                                quest::moveto($NewX, $NewY, $NewZ, -1, 1);
                            }
                        }
                    }
                }
                else {    # If not moving on the same Axis they are already on, just return them to their Spawn Point
                    quest::moveto($OrigX, $OrigY, $OrigZ, -1, 1);
                }
            }
            else {    # If we are not using the orignal X, then use the original Y instead
                if ($CurY == $OrigY) {    # If they are moving on the same Axis they are currently on
                    #Check for LoS and Z issues before moving to the new Loc
                    my $NewZ = $npc->FindGroundZ($NewX, $OrigY, 5) + 1;    #Add 1 to the new Z to prevent hopping issue when they arrive
                    if ($NewZ > -999999 && $OrigZ > ($NewZ - 16) && $OrigZ < ($NewZ + 14)) {
                        if ($NewX > $OrigX) {    # Checking which direction we are moving in
                            # Adjust the LoS Check to check further than how far we are traveling so we stay away from walls
                            my $LoS_Check = $npc->CheckLoSToLoc($NewX + 2, $OrigY, $NewZ, 5);
                            #Check LoS to the new random Loc
                            if ($LoS_Check) {
                                quest::moveto($NewX, $OrigY, $NewZ, -1, 1);
                            }
                        }
                        else {
                            # Adjust the LoS Check to check further than how far we are traveling so we stay away from walls                        
                            my $LoS_Check = $npc->CheckLoSToLoc($NewX - 2, $OrigY, $NewZ, 5);
                            #Check LoS to the new random Loc
                            if ($LoS_Check) {

                                quest::moveto($NewX, $OrigY, $NewZ, -1, 1);
                            }
                        }
                    }
                }
                else {    # If not moving on the same Axis they are already on, just return them to their Spawn Point
                    quest::moveto($OrigX, $OrigY, $OrigZ, -1, 1);
                }
            }
        }
    }
}

#Usage: plugin::RandomSwim(MaxXVariance, MaxYVariance, WaterSurfaceZ);

sub RandomSwim {

    my $npc = plugin::val('$npc');
    my $MaxXVariance = $_[0];
    my $MaxYVariance = $_[1];
    my $WaterSurfaceZ = $_[2];
    
    # Don't try to roam if already engaged in combat!
    if ($npc->IsEngaged() != 1) {

        #Get needed Locs
        my $CurX = $npc->GetX();
        my $CurY = $npc->GetY();
        #my $CurZ = $npc->GetZ();    #Not currently required by this plugin
        my $OrigX = $npc->GetSpawnPointX();
        my $OrigY = $npc->GetSpawnPointY();
        my $OrigZ = $npc->GetSpawnPointZ();
        my $GuardX = $npc->GetGuardPointX();
        my $GuardY = $npc->GetGuardPointY();

        if ($CurX == $GuardX && $CurY == $GuardY) {    #If the NPC has finished walking to the previous given Loc

            #Get a random X and Y within the set range
            my $RandomX = int(rand($MaxXVariance - 1)) + 1;
            my $RandomY = int(rand($MaxYVariance - 1)) + 1;
            my $PosX = $OrigX + $RandomX;
            my $PosY = $OrigY + $RandomY;
            my $NegX = $OrigX - $RandomX;
            my $NegY = $OrigY - $RandomY;
            my $NewX = quest::ChooseRandom($PosX, $NegX);
            my $NewY = quest::ChooseRandom($PosY, $NegY);
            
            #Check for LoS and Z issues before moving to the new Loc
            my $NewZ = $npc->FindGroundZ($NewX,$NewY, 5) + 1;    #Add 1 to the new Z to prevent hopping issue when they arrive
            if ($NewZ > -999999 && $NewZ < $WaterSurfaceZ) {
                my $SwimZ = int(rand($WaterSurfaceZ - $NewZ)) + $NewZ;    #Use a random Z between water surface and floor
                my $LoS_Check = $npc->CheckLoSToLoc($NewX, $NewY, $SwimZ, 5);
                #Check LoS to the new random Loc
                if ($LoS_Check) {
                    quest::moveto($NewX, $NewY, $SwimZ, -1, 1);
                }
            }
        }
    }
}

return 1;    #This line is required at the end of every plugin file in order to use it