Changeset 143

Show
Ignore:
Timestamp:
11/19/08 13:40:10 (17 years ago)
Author:
yumileroy
Message:

[svn] Check creature combat reach when loading db. This should fix the bug that finding random contact point causes crash.

Original author: megamage
Date: 2008-11-01 16:53:16-05:00

Location:
trunk/src/game
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/game/ObjectMgr.cpp

    r135 r143  
    959959    sLog.outString( ">> Loaded %u creature model based info", sCreatureModelStorage.RecordCount ); 
    960960    sLog.outString(); 
     961 
     962    // check if combat_reach is valid 
     963    for(uint32 i = 1; i < sCreatureModelStorage.MaxEntry; ++i) 
     964    { 
     965        CreatureModelInfo const* mInfo = sCreatureModelStorage.LookupEntry<CreatureModelInfo>(i); 
     966        if(!mInfo) 
     967            continue; 
     968 
     969        if(mInfo->combat_reach < 0.5f) 
     970        { 
     971            sLog.outErrorDb("Creature model (Entry: %u) has invalid combat reach (%f), setting it to 0.5", mInfo->modelid, mInfo->combat_reach); 
     972            const_cast<CreatureModelInfo*>(mInfo)->combat_reach = 0.5f; 
     973        } 
     974    } 
    961975} 
    962976 
  • trunk/src/game/TargetedMovementGenerator.cpp

    r141 r143  
    165165            i_destinationHolder.ResetUpdate(50); 
    166166 
    167         float dist = owner.GetFloatValue(UNIT_FIELD_COMBATREACH) + i_target.getTarget()->GetFloatValue(UNIT_FIELD_COMBATREACH) + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE); 
     167        float dist = owner.GetCombatReach() + i_target.getTarget()->GetCombatReach() + sWorld.getRate(RATE_TARGET_POS_RECALCULATION_RANGE); 
    168168 
    169169        //More distance let have better performance, less distance let have more sensitive reaction at target move. 
  • trunk/src/game/Unit.cpp

    r142 r143  
    406406{ 
    407407    assert(pVictim); 
    408     float reach = GetFloatValue(UNIT_FIELD_COMBATREACH); 
    409     if( reach <= 0.0f ) 
    410         reach = 1.0f; 
    411     return IsWithinDistInMap(pVictim, reach); 
     408    return IsWithinDistInMap(pVictim, GetCombatReach()); 
    412409} 
    413410 
     
    421418    float distsq = dx*dx + dy*dy + dz*dz; 
    422419    //not sure here, or combatreach + combatreach? 
    423     float sizefactor = GetFloatValue(UNIT_FIELD_COMBATREACH) + obj->GetFloatValue(UNIT_FIELD_COMBATREACH); 
     420    float sizefactor = GetCombatReach() + obj->GetCombatReach(); 
    424421    float maxdist = dist2compare + sizefactor; 
    425422 
     
    431428        uint32 attacker_number = getAttackers().size(); 
    432429    if(attacker_number > 0) --attacker_number; 
    433         GetNearPoint(obj,x,y,z,obj->GetFloatValue(UNIT_FIELD_COMBATREACH),distance2dMin+(distance2dMax-distance2dMin)*rand_norm() 
    434         , GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / GetFloatValue(UNIT_FIELD_COMBATREACH) / 3 : 0)); 
     430        GetNearPoint(obj,x,y,z,obj->GetCombatReach(), distance2dMin+(distance2dMax-distance2dMin)*rand_norm() 
     431        , GetAngle(obj) + (attacker_number ? (M_PI/2 - M_PI * rand_norm()) * (float)attacker_number / GetCombatReach() / 3 : 0)); 
    435432} 
    436433 
  • trunk/src/game/Unit.h

    r142 r143  
    722722        void SetCanDualWield(bool value) { m_canDualWield = value; } 
    723723        bool canReachWithAttack(Unit *pVictim) const; 
     724        float GetCombatReach() const { return m_floatValues[UNIT_FIELD_COMBATREACH]; } 
    724725        bool IsWithinCombatDist(Unit *obj, float dist2compare) const; 
    725726        void GetRandomContactPoint( const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const;