Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.50 KB | None | 0 0
  1. void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, bool hardForced)
  2. {
  3. int32 main_speed_mod = 0;
  4. float stack_bonus = 1.0f;
  5. float non_stack_bonus = 1.0f;
  6.  
  7. switch (mtype)
  8. {
  9. // Only apply debuffs
  10. case MOVE_FLIGHT_BACK:
  11. case MOVE_RUN_BACK:
  12. case MOVE_SWIM_BACK:
  13. break;
  14. case MOVE_WALK:
  15. case MOVE_RUN:
  16. {
  17. if (IsMounted()) // Use on mount auras
  18. {
  19. main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED);
  20. stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS);
  21. non_stack_bonus += GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK) / 100.0f;
  22. }
  23. else
  24. {
  25. main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SPEED);
  26. stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_SPEED_ALWAYS);
  27. non_stack_bonus += GetMaxPositiveAuraModifier(SPELL_AURA_MOD_SPEED_NOT_STACK) / 100.0f;
  28. }
  29. break;
  30. }
  31. case MOVE_SWIM:
  32. {
  33. main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SWIM_SPEED);
  34. break;
  35. }
  36. case MOVE_FLIGHT:
  37. {
  38. if (GetTypeId() == TYPEID_UNIT && IsControlledByPlayer()) // not sure if good for pet
  39. {
  40. main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
  41. stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS);
  42.  
  43. // for some spells this mod is applied on vehicle owner
  44. int32 owner_speed_mod = 0;
  45.  
  46. if (Unit* owner = GetCharmer())
  47. owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
  48.  
  49. main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
  50. }
  51. else if (IsMounted())
  52. {
  53. main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED);
  54. stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS);
  55. }
  56. else // Use not mount (shapeshift for example) auras (should stack)
  57. main_speed_mod = GetTotalAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) + GetTotalAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
  58.  
  59. non_stack_bonus += GetMaxPositiveAuraModifier(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK) / 100.0f;
  60.  
  61. // Update speed for vehicle if available
  62. if (GetTypeId() == TYPEID_PLAYER && GetVehicleBase())
  63. GetVehicleBase()->UpdateSpeed(MOVE_FLIGHT, true);
  64. break;
  65. }
  66. default:
  67. TC_LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type (%d)", mtype);
  68. return;
  69. }
  70.  
  71. // now we ready for speed calculation
  72. float speed = std::max(non_stack_bonus, stack_bonus);
  73. if (main_speed_mod)
  74. AddPct(speed, main_speed_mod);
  75.  
  76. switch (mtype)
  77. {
  78. case MOVE_RUN:
  79. case MOVE_SWIM:
  80. case MOVE_FLIGHT:
  81. {
  82. if (GetTypeId() == TYPEID_PLAYER)
  83. {
  84. Guardian* pet = this->GetGuardianPet();
  85. if (pet)
  86. pet->UpdateSpeed(mtype, this->GetSpeed(mtype));
  87. }
  88.  
  89. // Set creature speed rate
  90. if (GetTypeId() == TYPEID_UNIT)
  91. {
  92. Unit* pOwner = GetCharmerOrOwner();
  93. if ((isPet() || isGuardian()) && !isInCombat() && pOwner) // Must check for owner or crash on "Tame Beast"
  94. {
  95. // For every yard over 5, increase speed by 0.01
  96. // to help prevent pet from lagging behind and despawning
  97. float dist = GetDistance(pOwner);
  98. float base_rate = 1.00f; // base speed is 100% of owner speed
  99.  
  100. if (dist < 5)
  101. dist = 5;
  102.  
  103. float mult = base_rate + ((dist - 5) * 0.01f);
  104. speed *= mult;
  105.  
  106. if (pOwner->GetSpeedRate(mtype) > speed)
  107. speed *= pOwner->GetSpeedRate(mtype); // pets derive speed from owner when not in combat
  108. }
  109. else
  110. speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
  111. break;
  112. }
  113. break;
  114. }
  115. case MOVE_WALK:
  116. {
  117. if (GetTypeId() == TYPEID_UNIT)
  118. speed *= ToCreature()->GetCreatureTemplate()->speed_walk; // at this point, MOVE_WALK is never reached
  119. break;
  120. }
  121. default:
  122. break;
  123. }
  124.  
  125. // for creature case, we check explicit if mob searched for assistance
  126. if (GetTypeId() == TYPEID_UNIT)
  127. {
  128. if (ToCreature()->HasSearchedAssistance())
  129. speed *= 0.66f; // best guessed value, so this will be 33% reduction. Based off initial speed, mob can then "run", "walk fast" or "walk".
  130. }
  131.  
  132. // Apply strongest slow aura mod to speed
  133. int32 slow = GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED);
  134. if (slow)
  135. {
  136. AddPct(speed, slow);
  137. if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
  138. {
  139. float min_speed = minSpeedMod / 100.0f;
  140. if (speed < min_speed)
  141. speed = min_speed;
  142. }
  143. }
  144. // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
  145. // TODO: possible affect only on MOVE_RUN
  146. if (int32 normalization = GetMaxPositiveAuraModifier(SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED))
  147. {
  148. // Use speed from aura
  149. float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
  150. if (speed > max_speed)
  151. speed = max_speed;
  152. }
  153.  
  154. if (GetTypeId() == TYPEID_PLAYER)
  155. {
  156. Guardian* pet = this->GetGuardianPet();
  157. if (pet)
  158. pet->UpdateSpeed(mtype, speed);
  159. }
  160.  
  161. if (Unit* owner = GetCharmerOrOwner())
  162. {
  163. float speed = owner->GetSpeedRate(mtype);
  164. speed = speed;
  165. }
  166.  
  167. SetSpeed(mtype, speed, forced, hardForced);
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement