Stealth fix, not final.

Newbie Spellweaver
Joined
Feb 16, 2007
Messages
71
Reaction score
0
OK guys i changed a few things with stealth, it is now working pretty good. And i added the option to keep the old system in the ini. It is now possible to stealth arround an instance, i added collision detection (just distance in between mob and player), and fixed something to do with the size of the objects (before getdistance would only give the distance of the mob 4 feet infront of it, with this it is more accurate). Also added level detection, if a mob is 5 levels or more above the player he will be automaticly detected. I published this over at project mangos, let me know what you guys think. Once i have it down perfectly going to add some fixes to sap, gauge and garote.

well here goes :

added changes in mangosconf.ini :

Code:
#************************* NEW*****************
#Stealth probability rate
# default = 1, 0 = probability 0 of being seen by mob
RATE_STEALTH=0
#***********************************************

Modified function in unit.cpp :

Code:
bool Unit::isVisibleFor(Unit* u, bool detect)
{
   
 // Visible units, always are visible for all pjs
    if (m_Visibility == VISIBILITY_ON)
        return true;
    // GMs are visible for higher gms (or players are visible for gms)
    if (u->GetTypeId() == TYPEID_PLAYER && ((Player *)u)->isGameMaster())
        return (GetTypeId() == TYPEID_PLAYER && ((Player *)this)->GetSession()->GetSecurity() <= ((Player *)u)->GetSession()->GetSecurity());
    // non faction visibility non-breakable for non-GMs
    if (m_Visibility == VISIBILITY_OFF)
        return false;
    // Units far than MAX_DIST_INVISIBLE, that are not gms and are stealth, are not visibles too
    if (!this->IsWithinDist(u,MAX_DIST_INVISIBLE_UNIT))
        return false;
    // Stealth not hostile units, not visibles (except Player-with-Player case)
    if (!u->IsHostileTo(this))
    {
        // player autodetect other player with stealth only if he in same group or raid or same team (raid/team case dependent from conf setting)
        if(GetTypeId()==TYPEID_PLAYER && u->GetTypeId()==TYPEID_PLAYER)
        {
            if(((Player*)this)->IsGroupVisibleFor(((Player*)u)))
                return true;
            // else apply same rules as for hostile case (detecting check)
        }
        else
            return true;
    }
    // if in non-detect mode then invisible for unit
    if(!detect)
        return false;
    bool IsVisible = true;
    bool notInFront = u->isInFront(this, MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ? 0 : 1;
    float Distance = sqrt(GetDistanceSq(u));
    float prob = 0;
 int32 x = u->getLevel() + (u->m_detectStealth / 5) - (m_stealthvalue / 5) + 59;
 
//Code not needed anymore, but still commented to show progression and future needs
/*
 float PlayerPositionX = converter(((Player*)this)->GetPositionX());
 float PlayerPositionY = converter(((Player*)this)->GetPositionY());
 float PlayerPositionZ = converter(((Player*)this)->GetPositionZ());
 float MobPositiontest = converter(((Player*)this)->GetPositionX()- sqrt(GetDistanceSq(u)));// test
 float MobPositionX = converter(((Player*)this)->GetPositionX()+ sqrt(GetDistanceSq(u)));
 float MobPositionY = converter(((Player*)this)->GetPositionY()+ sqrt(GetDistanceSq(u)));
 float MobPositionZ = converter(((Player*)this)->GetPositionZ()+ sqrt(GetDistanceSq(u)));
    
 //INITIALISE COLLISION VARIABLES
 float collisionX = 0;
 float collisionY = 0;
 float collisionZ = 0;
    
    //detecting if there is a collision or user is very close to a mob student1
 //the constant 2.3 is used to fix the issue with getdistance not being very exact, currently it does not center at the mob, 4 feet infront of it right now
 collisionX = converter(PlayerPositionX - MobPositionX);
 collisionY = converter(PlayerPositionY - MobPositionY);
 collisionZ = converter(PlayerPositionZ - MobPositionZ);
 
     
 //Shows values onscreen //student1
 cout << "PlayerPositionY: " << PlayerPositionY << "\n";
 cout << "MobPositionY: " << MobPositionY << "\n";
 cout << "PlayerPositionX: " << PlayerPositionX << "\n";
 cout << "MobPositionX: " << MobPositionX << "\n";
 cout << "PlayerPositionZ: " << PlayerPositionZ << "\n";
 cout << "MobPositionZ: " << MobPositionZ << "\n";
*/
 //Simple printscreen to show distance from mobs in console. Student1
 
 cout << "Stealth activated: Distance from mobs: " << GetDistanceSq(u) << "\n";
/*
 cout << "collisions x " << collisionX << "\n";
 cout << "collision y " << collisionY << "\n";
 cout << "collision Z " << collisionZ << "\n";
 */
    //cout << "mob level " << u->getLevel() << "/n";
 //cout << "player level " << ((Player*)this)->getLevel() << "/n" ;
 
//This verifies if the player is on top of the mob, if he is he is detected, therefore collision detection :) student1
//if (collisionX <= 1 && collisionY <= 1 && collisionZ <= 1  )
   //if (collisionX<=0.01 && collisionY<=0.01 && collisionZ<=0.01)//student1
 if (GetDistanceSq(u)<0.20)//student1
     {
      IsVisible = true; // removes invisibility student1
   //return fuction is visible = true
   return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ;
     }
      
  //If mob is 5 levels or more above player then player is detected automaticly. Student1
  if (u->getLevel() >= ((Player*)this)->getLevel()+ 5)
  {  
   IsVisible = true; // removes invisibility student1
      return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ;
     }
     //If variable RATE_STEALTH in config == 0 we do not use the old detection, easier to stealth arround
  if (sWorld.getRate(RATE_STEALTH)==0) //student1
     IsVisible = false; // remains visible student1
      
 
   else { 
 
 // Function for detection (can be improved)
    // Take into account that this function is executed every x secs, so prob must be low for right working
    
    if (x<0) x = 0;
    float AverageDist = 1 - 0.11016949*x + 0.00301637*x*x;  //at this distance, the detector has to be a 15% prob of detect
    if (AverageDist < 1) AverageDist = 1;
    if (Distance > AverageDist)
        //prob between 10% and 0%
        prob = (AverageDist-200+9*Distance)/(AverageDist-20);
    else
        prob = 75 - (60/AverageDist)*Distance;              //prob between 15% and 75% (75% max prob)
    if (notInFront)
        prob = prob/100;
    if (prob < 0.1)
        prob = 0.1;                                         //min prob of detect is 0.1
    if (rand_chance() > prob)
        IsVisible = false;
    else
          
  IsVisible = true; 
         }
     
    return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ;
}
modified function in world.cpp

Code:
float WorldObject::GetDistanceSq(const WorldObject* obj) const
{
    float dx = GetPositionX() - obj->GetPositionX();
    float dy = GetPositionY() - obj->GetPositionY();
    float dz = GetPositionZ() - obj->GetPositionZ();
    float sizefactor = GetObjectSize() + obj->GetObjectSize() - 2.28; //size factor is too big student1
 if (sizefactor <= 0) sizefactor = 1; //makes sures values are not negative for too little objects student1
    float dist = sqrt((dx*dx) + (dy*dy) + (dz*dz)) - sizefactor;
    return ( dist > 0 ? dist * dist : 0);
}

Added the fallowing variable in world.cpp in under void World::SetInitialWorldSettings() (under the raterate section)
Code:
//Added mangos.ini rate_stealth, this variable controls probability of stealth detection
 rate_values[RATE_STEALTH] = sConfig.GetFloatDefault("RATE_STEALTH", 1);
Added the fallowing under world.h under enum Rates
Code:
//Stealth prob initialisation
 RATE_STEALTH,

Well these are the main changes, let me know if you want the cpp, ?h and ini files i ll make them availble easier than edtting the whle thing by hand.

Well let me know what you guys think, be back later.
 
nicely done...tested it and works just fine
one thing though...i just wished there was a good fix for the pickpocket skill....even if the stealth is implemented when i pickpocket some 20 lvl low humanoids they break my stealth...can u provide a solution?

Example:
As u know, the horde rogues have a chain quests for the poison skill...they must pickpocket a key from a goblin, then kill another elite goblin and lock-loot his chest for a poison reagent.

Well, tried that quest at lvl 60, just to be sure the lvl gap was high enough; i stealth, pickpocket the goblin but i don't have a chance to get his key because he instantly turns and breaks my stealth...

Tried it about 3 times...same thing.


I have to mention that pickpocketing is so cool on funservers...20-30g per pocket...and another 20-30g after the kill, in the loot.


P.S. I must have borred u by now...so cheerz m8:
great work
hope to hear
from u
really soon

Hola
 
Great man =), thanks for letting me know it works =). I will look into pickpocket for sure, on my list i have sap, garot etc to fix. First dealing with stealth as it still doesnt function a 100% as i d liked.

i have again hevely modified the stealth scheme, this time different levels of probability of being detected depending on level different between mob and you. Variable super stealth is still in place so if you want to have no steath detection only collision you change it in the ini.

here is the new and improved (i hope ;)) stealth detection function and what it does :


-Range detection, centers on mob no more 3 feet extremeties so it is now possible to implement correctly sap and other stealth attacjs
-Collision detection, if touching a mob stealth is automaticly lost
-Stealth depending on level, the higher the difference in level the higher the probability of detection ( using old values minus the level of mob values as it should change anything towards detection, only difference in level between mo.
-Different probability per difference of level. If the difference is 0 very low possibility of being detected if it is 4 very higher and more than 5 you are detected automaticly.

There are more changes needed to make it blizlike : example if mob is about to detect mob turns arround and starts to growl. Any suggestions on this?
Also probability values are not blizlike but the function is called a lot of times per sec, if it wa higher it would be useless, but there might be some changes possible.


here is the new stealth detection function, ... ah yes added variable in ini, if it 0 then detection probability is nullified and it only possible to get detected by colliding into mob.


enough talk, here is the new function :


Code:
bool Unit::isVisibleFor(Unit* u, bool detect)

{
      
    // Visible units, always are visible for all pjs
    if (m_Visibility == VISIBILITY_ON)
        return true;

    // GMs are visible for higher gms (or players are visible for gms)
    if (u->GetTypeId() == TYPEID_PLAYER && ((Player *)u)->isGameMaster())
        return (GetTypeId() == TYPEID_PLAYER && ((Player *)this)->GetSession()->GetSecurity() <= ((Player *)u)->GetSession()->GetSecurity());

    // non faction visibility non-breakable for non-GMs
    if (m_Visibility == VISIBILITY_OFF)
        return false;

    // Units far than MAX_DIST_INVISIBLE, that are not gms and are stealth, are not visibles too
    if (!this->IsWithinDist(u,MAX_DIST_INVISIBLE_UNIT))
        return false;

    // Stealth not hostile units, not visibles (except Player-with-Player case)
    if (!u->IsHostileTo(this))
    {
        // player autodetect other player with stealth only if he in same group or raid or same team (raid/team case dependent from conf setting)
        if(GetTypeId()==TYPEID_PLAYER && u->GetTypeId()==TYPEID_PLAYER)
        {
            if(((Player*)this)->IsGroupVisibleFor(((Player*)u)))
                return true;

            // else apply same rules as for hostile case (detecting check)
        }
        else
            return true;
    }

    // if in non-detect mode then invisible for unit
    if(!detect)
        return false;

    bool IsVisible = true;
    bool notInFront = u->isInFront(this, MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ? 0 : 1;
    float Distance = sqrt(GetDistanceSq(u));
    float prob = 0;
    //Assigns the current level of the mobs and players to 2 variables
    int mobLevel = u->getLevel();
    int playerLevel = ((Player*)this)->getLevel();
    int LevelDif = 0;
    int32 x = (u->m_detectStealth / 5) - (m_stealthvalue / 5) + 59;  //int32 x = u->getLevel() + (u->m_detectStealth / 5) - (m_stealthvalue / 5) + 59;
    //Original probability values
    //removed level of mob in calculation as it should not affect the detection, it is mainly dependant on level difference
    float AverageDist = 1 - 0.11016949*x + 0.00301637*x*x;  //at this distance, the detector has to be a 15% prob of detect
    if (x<0) x = 0;
    if (AverageDist < 1) AverageDist = 1;
    if (Distance > AverageDist)
    //prob between 10% and 0%
    prob = (AverageDist-200+9*Distance)/(AverageDist-20);
    else
    prob = 75 - (60/AverageDist)*Distance;              //prob between 15% and 75% (75% max prob)
    if (notInFront)
    prob = prob/100;
    if (prob < 0.1)
    prob = 0.1;     

    
    
    //Gets the difference in level between player and mob
    LevelDif = mobLevel - playerLevel;
    //Show in console distance between player and mob
    cout << "Stealth activated: Distance from mobs: " << GetDistanceSq(u) << "\n";
    cout << "LevelDif: " << LevelDif << "\n";
    // Detection variable = 0 then no stealth detection (simple collision detection used independant of level)
    if ((sWorld.getRate(RATE_STEALTH)==0) && (GetDistanceSq(u)> 0.20)) 
    {
          IsVisible = false; // remains visible student1
          return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT);
    }
  //New system, takes level in consideration when applying detection

    //If the mob is one level less or more there is no detection unless there is collision
    if ((LevelDif<0) && (GetDistanceSq(u)> 0.20))
    {
          IsVisible = false; // remains visible student1
          return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT);
    }

    //If the mob is 5 or more levels more than the player there will be detection
    if (LevelDif>=5)
    {
          IsVisible = true; 
          return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT);
     }

    
    //This establishes level detection based on level, the higher the mob level the higher the chance of detection.
    switch (LevelDif)
    {

    //If same level with mob
    case 0:
          //min prob of detect is 0.1
          if ((rand_chance() > prob/15) && (GetDistanceSq(u)> 0.20))
          {
               IsVisible = false;
              cout << "Probability: " << prob << "\n";
          }
             else
          IsVisible = true; 
    break;

     //If mob has one level more
    case 1:
          if ((rand_chance() > prob/10) && (GetDistanceSq(u)> 0.20))
          {
               IsVisible = false;
              cout << "Probability: " << prob << "\n";
          }
             else
          IsVisible = true; 
    break;
      
    //If mob has 2 levels more
    case 2:
          if ((rand_chance() > prob/5) && (GetDistanceSq(u)> 0.20))
          {
               IsVisible = false;
              cout << "Probability: " << prob << "\n";
          }
             else
          IsVisible = true; 
    break;

    //If mob has 3 level more
    case 4:
          //min prob of detect is 0.1
          if ((rand_chance() > prob/2.5) && (GetDistanceSq(u)> 0.20))
          IsVisible = false;
             else
          IsVisible = true; 
    break; 

    //If mob has 4 levels more
    case 5:
          //min prob of detect is 0.1
          if ((rand_chance() > prob/1.5) && (GetDistanceSq(u)> 0.20))
          IsVisible = false;
             else
          IsVisible = true; 
    break;

   }
            
    return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT);
}


















Anyway here is a first release of my core patch, it is for version 1.12.1 mangos 3297. I made it work under fanatiks latest release (not last one but the older one that has the src available) but i havent tested under 3297 as i have the new 2.08 installed and only one test computer, but i do not foresee any problems.


Here is the link:



it contains both the modified cpp, ini, h and for your pleasure a compiled version for those not progamming inclined ;).

Let me know what you think, this is mainly for testing and works only on 1.12.1.

later, please no pm s if you never done this before this is for experienced users and programmers that want to test new code.
 
Well it does work on TB, only problem is i dont have source for fanaticks build so i can t recompile with his mdified source ; /. Have an old build of fanatik and it works fine with that one, only errors out on mails when starting cause structure was changed in latest silvermonnrelease. Otherwise it probably works 100 %.
 
Re: Stealth fix, not final...but close ;)

Well it took me some time to figure it out but i know a bit more about programming mangos than i did at the begining of the day.
I have just added a detection modifier based on mob rank. Elite, rare, world boss and rare elite all have now a better chance od detecting you. Still low numbers but they make a differences if they are repeated enough times.

here is the new modified isVisibleFor function from unit cpp. All the rest are unchanged. Next goal is to make mobs turn when they are about to detect you, growl and wait, if you do go away within a few seconds they detect you. If anyone has few ideas on implementation and how blizzard calculates detection versus mob instincs (about to detect) please share.


bool Unit::isVisibleFor(Unit* u, bool detect)

{

// Visible units, always are visible for all pjs
if (m_Visibility == VISIBILITY_ON)
return true;

// GMs are visible for higher gms (or players are visible for gms)
if (u->GetTypeId() == TYPEID_PLAYER && ((Player *)u)->isGameMaster())
return (GetTypeId() == TYPEID_PLAYER && ((Player *)this)->GetSession()->GetSecurity() <= ((Player *)u)->GetSession()->GetSecurity());

// non faction visibility non-breakable for non-GMs
if (m_Visibility == VISIBILITY_OFF)
return false;

// Units far than MAX_DIST_INVISIBLE, that are not gms and are stealth, are not visibles too
if (!this->IsWithinDist(u,MAX_DIST_INVISIBLE_UNIT))
return false;

// Stealth not hostile units, not visibles (except Player-with-Player case)
if (!u->IsHostileTo(this))
{
// player autodetect other player with stealth only if he in same group or raid or same team (raid/team case dependent from conf setting)
if(GetTypeId()==TYPEID_PLAYER && u->GetTypeId()==TYPEID_PLAYER)
{
if(((Player*)this)->IsGroupVisibleFor(((Player*)u)))
return true;

// else apply same rules as for hostile case (detecting check)
}
else
return true;
}

// if in non-detect mode then invisible for unit
if(!detect)
return false;

bool IsVisible = true;
bool notInFront = u->isInFront(this, MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ? 0 : 1;
float Distance = sqrt(GetDistanceSq(u));
float prob = 0;
float modifier = 1;
//Assigns the current level of the mobs and players to 2 variables
int mobLevel = u->getLevel();
int playerLevel = ((Player*)this)->getLevel();
int LevelDif = 0;
int32 x = (u->m_detectStealth / 5) - (m_stealthvalue / 5) + 59; //int32 x = u->getLevel() + (u->m_detectStealth / 5) - (m_stealthvalue / 5) + 59;
//rank initialisation
int rank =0;

//gets the rank of the creature, this will be used to include a probability modifier for elite, rare, world boss
//int rank = ((Creature*)u)->GetCreatureInfo()->rank;
rank =((Creature const*)u)->GetCreatureInfo()->rank;

//Original probability values
//removed level of mob in calculation as it should not affect the detection, it is mainly dependant on level difference
float AverageDist = 1 - 0.11016949*x + 0.00301637*x*x; //at this distance, the detector has to be a 15% prob of detect
if (x<0) x = 0;
if (AverageDist < 1) AverageDist = 1;
if (Distance > AverageDist)
//prob between 10% and 0%
prob = (AverageDist-200+9*Distance)/(AverageDist-20);
else
prob = 75 - (60/AverageDist)*Distance; //prob between 15% and 75% (75% max prob)
if (notInFront)
prob = prob/100;
if (prob < 0.1)
prob = 0.1;

//applies a probability modifier depending if mobs are normal, elite, rare, rare elite or world bosses
switch (rank)
{
//normal no modifier
case 0 : modifier =1; break;

case 1 : modifier =1.2; break; // elite

case 2 : modifier =1.4; break; // rareelite

case 3 : modifier =1.6; break; //worldboss

case 4 : modifier =1.8; break; //rare elite

default : modifier=1; break; //abnormal case, should never enter this line, only for safety.
}


//Gets the difference in level between player and mob
LevelDif = mobLevel - playerLevel;
//Show in console distance between player and mob
cout << "Stealth activated: Distance from mobs: " << GetDistanceSq(u) << "\n";
cout << "LevelDif: " << LevelDif << "\n";
// Detection variable = 0 then no stealth detection (simple collision detection used independant of level)
if ((sWorld.getRate(RATE_STEALTH)==0) && (GetDistanceSq(u)> 0.20))
{
IsVisible = false; // remains visible student1
return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ;
}
//New system, takes level in consideration when applying detection

//If the mob is one level less or more there is no detection unless there is collision
if ((LevelDif<0) && (GetDistanceSq(u)> 0.20))
{
IsVisible = false; // remains visible student1
return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ;
}

//If the mob is 5 or more levels more than the player there will be detection
if (LevelDif>=5)
{
IsVisible = true;
return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ;
}


//This establishes level detection based on level, the higher the mob level the higher the chance of detection.
switch (LevelDif)
{

//If same level with mob
case 0:
//min prob of detect is 0.1
if ((rand_chance() > ((prob*modifier)/15)) && (GetDistanceSq(u)> 0.20))
{
IsVisible = false;
cout << "Probability: " << prob << "\n";
}
else
IsVisible = true;
break;

//If mob has one level more
case 1:
if ((rand_chance() > ((prob*modifier)/10)) && (GetDistanceSq(u)> 0.20))
{
IsVisible = false;
cout << "Probability: " << prob << "\n";
}
else
IsVisible = true;
break;

//If mob has 2 levels more
case 2:
if ((rand_chance() > ((prob*modifier)/5)) && (GetDistanceSq(u)> 0.20))
{
IsVisible = false;
cout << "Probability: " << prob << "\n";
}
else
IsVisible = true;
break;

//If mob has 3 level more
case 4:
//min prob of detect is 0.1
if ((rand_chance() > ((prob*modifier)/2.5)) && (GetDistanceSq(u)> 0.20))
IsVisible = false;
else
IsVisible = true;
break;

//If mob has 4 levels more
case 5:
//min prob of detect is 0.1
if ((rand_chance() > ((prob*modifier)/1.5)) && (GetDistanceSq(u)> 0.20))
IsVisible = false;
else
IsVisible = true;
break;

}

return IsVisible && ( Distance <= MAX_DIST_INVISIBLE_UNIT * MAX_DIST_INVISIBLE_UNIT) ;
}



later guys.
 
I will =), trying to get it on original mangos. But i heard there was a stealth patch release for 3310. Not sure whats in there... i ll check later when i have the time. I was about to implement mob turn arround. What i called instinctdetection ;). But not sure if how they modified the source... I ll check it and be back later
 
Small update:
Implementing mob turning on detection was harder than i thought but it is almost done now ;)!
here a bit of the code i m using :

Code:
 //Text used by instinct detection, warning if you come any closer your ass is grass;)
 const char* TextHumanoid;
 const char* TextMonster;
 const char* TextRobot;
 const char* TextMob; 
    TextHumanoid= "Hmmm";
 TextMonster= "Grrr";
 TextRobot= "Analysing";
 //Gets the race of the player (so message can be said in correct language)
 
 int MobType = ((Creature *)u)->GetCreatureInfo()->type;
 //Sets type of monster language
 if (MobType==7) TextMob=TextHumanoid;
 if (MobType==9) TextMob=TextRobot;
 if ((MobType!=7) && (MobType != 9)) TextMob=TextMonster;
 
 
 cout <<"monster type " << MobType << "\n";
 
 //Monster interaction 
 ((Creature *)u)->MonsterSay(TextMob,0 ,((Player*)this)->GetUInt64Value(OBJECT_FIELD_GUID));
 ((Creature *)u)->SetInFront(((Player*)this));
 ((Creature *)u)->StopMoving(); // test
 ((Creature *)u)->clearUnitState(UNIT_STAT_MOVING);

Now i need some help from you guys, what do hUMANS, monsters and mechanical say when they think there is someone close? Need to implement it as close as possible but i m jsut not sure... doubt its hmmm for humanoid ;p
Also anyone has any idea how to implement sound on this kid of detection (mob growling etc ) with emotes and a way to get access to them using c++.

anyway be back later tomorow, hopefully with a release of the almost final stealth system ;)!

later
 
Posted on mangos project forum But still Ironing the bugs. Mostly a core rewrite of the stealth detection system keeping the initial formulas + some tweaks. Had some problem with the client update but i think this will be fixed today, just got wind of some code to update client after a chance occurs. I ll be posting later on once it is working. I ll create a new thread for beta testing so you guys can recommend on a few formula changes on just how the normal server reacts so it becomes more blizlike.
 
Back