Jump to content

DrKLO

Members
  • Posts

    20
  • Joined

  • Last visited

    Never
  • Donations

    0.00 GBP 

Posts posted by DrKLO

  1. i found one crash, main thread stuck in this part of code

    void WorldSession::SendDoFlight( uint32 mountDisplayId, uint32 path, uint32 pathNode )
    {
       // remove fake death
       if (GetPlayer()->hasUnitState(UNIT_STAT_DIED))
           GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH);
    
       while(GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE) //STUCK HERE
           GetPlayer()->GetMotionMaster()->MovementExpired(false);
    
       if (mountDisplayId)
           GetPlayer()->Mount( mountDisplayId );
    
       GetPlayer()->GetMotionMaster()->MoveTaxiFlight(path,pathNode);
    }
    

    i added iteration counter in this loop and break it when it equal to 100, no core stuck any more

    maybe someone have the same problem?

  2. to Lightguard, the problem is not only in the instance reset. If someone change difficulty who outside dungeon, and someone who inside make relog in the game - server will crash, because he will enter in the dungeon that not bind to him, and we get assert(false) in the code

    sLog.outError("InstanceMap::Add: player %s(%d) is being put in instance %d,%d,%d,%d,%d,%d but he is in group %d and is bound to instance %d,%d,%d,%d,%d,%d!", player->GetName(), player->GetGUIDLow(), mapSave->GetMapId(), mapSave->GetInstanceId(), mapSave->GetDifficulty(), mapSave->GetPlayerCount(), mapSave->GetGroupCount(), mapSave->CanReset(), GUID_LOPART(pGroup->GetLeaderGUID()), playerBind->save->GetMapId(), playerBind->save->GetInstanceId(), playerBind->save->GetDifficulty(), playerBind->save->GetPlayerCount(), playerBind->save->GetGroupCount(), playerBind->save->CanReset());
                           if(groupBind) sLog.outError("InstanceMap::Add: the group is bound to instance %d,%d,%d,%d,%d,%d", groupBind->save->GetMapId(), groupBind->save->GetInstanceId(), groupBind->save->GetDifficulty(), groupBind->save->GetPlayerCount(), groupBind->save->GetGroupCount(), groupBind->save->CanReset());
                           assert(false);
    

    we just prvevent it

    i think it's bl1zz like, bacause i got message that i can't change dungeon difficulty, bacause i or some of my party members in the dungeon already

  3. if someone compile source with #define MANGOS_DEBUG and enable logs, we should see what happened before crash in logs

    maybe we should change in WaypointMovementGenerator.cpp this

    // prevent a crash at empty waypoint path.
       if (!i_path || i_path->empty())
       {
           creature.clearUnitState(UNIT_STAT_ROAMING_MOVE);
           return true;
       }
    
       // i_path was modified by chat commands for example
       if (i_path->size() != i_hasDone.size())
           i_hasDone.resize(i_path->size());
    
       if (i_currentNode >= i_path->size())
           i_currentNode = 0;
    

    and this

       CreatureTraveller traveller(creature);
    
       i_nextMoveTime.Update(diff);
       i_destinationHolder.UpdateTraveller(traveller, diff, false, true);
    

    to avoid crash

  4. CreatureTraveller traveller(creature);
    
    i_nextMoveTime.Update(diff);
    i_destinationHolder.UpdateTraveller(traveller, diff, false, true); -this
    

    function DestinationHolder<TRAVELLER>::UpdateTraveller
    ...
    traveller.Relocation(x, y, z, ori); - in some cases - this
    

    template<>
    inline void Traveller<Creature>::Relocation(float x, float y, float z, float orientation)
    {
       i_traveller.GetMap()->CreatureRelocation(&i_traveller, x, y, z, orientation);
    }
    

    void
    Map::CreatureRelocation(Creature *creature, float x, float y, float z, float ang)
    ...
    // if creature can't be move in new cell/grid (not loaded) move it to repawn cell/grid
    // creature coordinates will be updated and notifiers send
    if(!CreatureRespawnRelocation(creature)) - this
    

    bool Map::CreatureRespawnRelocation(Creature *c)
    ...
    c->GetMotionMaster()->Clear(); - this
    

    in 9400-9401 there was added some changes in CreatureRelocation, and maybe some of this changes delete WaypointMovementGenerator? so we have crash, and i_path = 0

  5. But DrKLO said that SD2 starting in other thread in current realization of core, but it's need check.

    i say that it's look like, not sure

    Vladimir, can after MovementInform(creature); - creature.IsStopped() become false?

    Russian:

    Если не может, то краш точно не из за этого, т.к. краш только тогда, когда creature.IsStopped() = false.

  6. if we look at code we see

    if (creature.IsStopped()){ - look at this check
    ....
    MovementInform(creature);
    }
    

    and after

    if (i_nextMoveTime.Passed())
       {
           // If stopped then begin a new move segment
           if (creature.IsStopped()) - the same check
           {
            ....
           }
           else
          {
              ....
               i_nextMoveTime.Reset(i_path->at(i_currentNode).delay); - there was crash, because i_past = null;
               ...
           }
    

    if first check passed, crash code can't be call

    so making check i_path after MovementInform(creature); as in [9434] doesn't help

    looks like it's deleted from other thread, but creatures on what was crash don't have eventAI or SD2 scripts

    PS sorry for my bad english

  7. this hack and bug can't cause crash in WorldSession::HandleMovementOpcodes

    and i think can't cause server freeze, because function WaypointMovementGenerator<Creature>::Update doesn't have loop, it's called once for each time diff as i see.

    if you have freezes, try to disable logs and compile without debug and with optimization, because with loglevel = 3 i have freezes too. Now uptime is more then one day with 300+ online for me.

  8. else

    {

    // If not stopped then stop it and set the reset of TimeTracker to waittime

    creature.StopMoving();

    SetStoppedByPlayer(false);

    if(!i_path)

    {

    sLog.outDebug("wtf? path is null!\\n"); //-----add this check

    return true;

    }

    i_nextMoveTime.Reset(i_path->at(i_currentNode).delay);

    ++i_currentNode;

    if (i_currentNode >= i_path->size())

    i_currentNode = 0;

    }

    Could u tell me please, where shall i type it?

    WaypointMovementGenerator.cpp - line 243

  9. so

    else
           {
               // If not stopped then stop it and set the reset of TimeTracker to waittime
               creature.StopMoving();
               SetStoppedByPlayer(false);
           if(!i_path)
           {
           sLog.outDebug("wtf? path is null!\\n"); //-----add this check
           return true;
           }
    
               i_nextMoveTime.Reset(i_path->at(i_currentNode).delay);
               ++i_currentNode;
    
               if (i_currentNode >= i_path->size())
                   i_currentNode = 0;
           }
    

    so crash is disappear, i_path become null, don't know why. In log i see my check.

    all this creatures have event_ai, and maybe during update this calls MonsterMoveWithSpeed, and then Reset, that makes i_path = null

  10. crashed 3 times on creature with entry 10760, guid 94985

    and one with creature entry 3501, guid 52494

    both when LoadPath, i think it's called after movgen->Reset(*creature); that was added in 9400

    i think that's YTDB bug

    i'll try to clear this creature waypoints

  11. What bug does the patch fix? What features does the patch add?

    If you fully broke you weapon, wear it and learn talent(for example Two-Handed Weapon Specialization),

    then you weapon damage increase. Then unwear this weapon and unlearn talents. You damage doesn't decrease. You can do it a lot of times, and you melee damage will be increase and increase. So we shouldn't increase damage with broken item.

    For which repository revision was the patch created?

    8809+

    Is there a thread in the bug report section or at lighthouse? If yes, please add a link to the thread.

    Didn't find any

    Who has been writing this patch? Please include either forum user names or email addresses.

    Me

    diff --git a/src/game/Player.cpp b/src/game/Player.cpp
    index b93b34c..62bc9e7 100644
    --- a/src/game/Player.cpp
    +++ b/src/game/Player.cpp
    @@ -6889,6 +6889,10 @@ void Player::_ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attac
    
    void Player::_ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType attackType, Aura* aura, bool apply)
    {
    +    //don't apply mod if item is broken
    +    if(item->IsBroken())
    +        return;
    +
        // ignore spell mods for not wands
        Modifier const* modifier = aura->GetModifier();
        if((modifier->m_miscvalue & SPELL_SCHOOL_MASK_NORMAL)==0 && (getClassMask() & CLASSMASK_WAND_USERS)==0)
    
    

  12. 2 functions

    GameObject*
    ObjectAccessor::GetGameObject(WorldObject const &u, uint64 guid)
    {
       GameObject * ret = GetObjectInWorld(guid, (GameObject*)NULL);
       if(!ret)
           return NULL;
       if(ret->GetMapId() != u.GetMapId())
           ret = NULL;
       if(ret->GetInstanceId() != u.GetInstanceId())
           return NULL;
       return ret;
    }
    
    DynamicObject*
    ObjectAccessor::GetDynamicObject(WorldObject const &u, uint64 guid)
    {
       DynamicObject * ret = GetObjectInWorld(guid, (DynamicObject*)NULL);
       if(!ret)
           return NULL;
       if(ret->GetMapId() != u.GetMapId())
           ret = NULL;
       if(ret->GetInstanceId() != u.GetInstanceId())
           return NULL;
       return ret;
    }
    

    if(ret->GetMapId() != u.GetMapId())
           ret = NULL;
    

    !!! ret = 0 and after this ret->GetInstanceId().

    if(ret->GetInstanceId() != u.GetInstanceId())
           return NULL;
    

    i think there should be

    if(ret->GetMapId() != u.GetMapId())
            return NULL;
    

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use