diff options
author | maximius <none@none> | 2009-09-27 19:11:52 -0700 |
---|---|---|
committer | maximius <none@none> | 2009-09-27 19:11:52 -0700 |
commit | 15dbc456bb973e9a9e427470ba3b8a2f90a55d21 (patch) | |
tree | 4a3c7885819bc61ccb7343ae6625b0764da505ce | |
parent | 2c14426c76e1d27dd9e3dd8e2397ab3453360940 (diff) |
*If our target of choice is attacking a player, only attack our target if we are friendly towards that player.
*Only regenerate quickly if polymorphed.
--HG--
branch : trunk
-rw-r--r-- | src/game/Creature.cpp | 19 | ||||
-rw-r--r-- | src/game/Unit.cpp | 9 |
2 files changed, 15 insertions, 13 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index f1909adb157..b9499a9b8b5 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -530,27 +530,26 @@ void Creature::Update(uint32 diff) break; bool bIsPolymorphed = IsPolymorphed(); - bool bNotInCombat = !isInCombat() || getThreatManager().isThreatListEmpty() || - (getVictim() && getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself() && - getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself()->isGameMaster()); - bool bControlledOrOwnedByPlayer = GetCharmerOrOwner() && GetCharmerOrOwner()->GetTypeId() == TYPEID_PLAYER; - - if(m_regenTimer > diff && !bIsPolymorphed && // if polymorphed, skip the timer - ((bNotInCombat && bControlledOrOwnedByPlayer) || // if not in combat and a pet, do not skip the timer - !bNotInCombat)) // if in combat, do not skip the timer + bool bInCombat = isInCombat() && (!getVictim() || // if isInCombat() is true and this has no victim + !getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself() || // or the victim/owner/charmer is not a player + !getVictim()->GetCharmerOrOwnerPlayerOrPlayerItself()->isGameMaster()); // or the victim/owner/charmer is not a GameMaster + + if(m_regenTimer > diff && !bIsPolymorphed) // if polymorphed, skip the timer m_regenTimer -= diff; else { - if(bNotInCombat || bIsPolymorphed) // regenerate health if not in combat or polymorphed + if(!bInCombat || bIsPolymorphed) // regenerate health if not in combat or if polymorphed RegenerateHealth(); if(getPowerType() == POWER_ENERGY) + { if(!IsVehicle() || GetVehicleKit()->GetVehicleInfo()->m_powerType != POWER_PYRITE) Regenerate(POWER_ENERGY); + } else RegenerateMana(); - if(!bNotInCombat && !bIsPolymorphed) // only increase the timer if not in combat and not polymorphed + if(!bIsPolymorphed) // only increase the timer if not polymorphed m_regenTimer += 2000 - diff; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 0d45ed36457..a05cc8929ea 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -11344,7 +11344,7 @@ Unit* Creature::SelectVictim() else return NULL; - if(target) + if(target && (!target->isAttackingPlayer() || IsFriendlyTo(target->getVictim()))) // if the victim of target is a player, only defend the victim if we are friendly { SetInFront(target); return target; @@ -11356,7 +11356,9 @@ Unit* Creature::SelectVictim() // Note: creature not have targeted movement generator but have attacker in this case for(AttackerSet::const_iterator itr = m_attackers.begin(); itr != m_attackers.end(); ++itr) { - if(canCreatureAttack(*itr) && ((*itr)->GetTypeId() != TYPEID_PLAYER && (!((Creature*)(*itr))->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)))) + if(canCreatureAttack(*itr) && (*itr)->GetTypeId() != TYPEID_PLAYER + && !((Creature*)(*itr))->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN) + && (!(*itr)->isAttackingPlayer() || IsFriendlyTo(target->getVictim()))) // if the victim of target is a player, only defend the victim if we are friendly return NULL; } @@ -11367,7 +11369,8 @@ Unit* Creature::SelectVictim() // search nearby enemy before enter evade mode if(HasReactState(REACT_AGGRESSIVE)) if(target = SelectNearestTarget()) - return target; + if(!target->isAttackingPlayer() || IsFriendlyTo(target->getVictim())) // if the victim of target is a player, only defend the victim if we are friendly + return target; if(m_invisibilityMask) { |