Core/Creatures: Updated power type handling

This commit is contained in:
hondacrx
2018-03-04 23:40:51 -05:00
parent 17d3836438
commit b067976678
7 changed files with 119 additions and 82 deletions
+4 -10
View File
@@ -1159,28 +1159,22 @@ namespace Game.Entities
switch (GetClass()) switch (GetClass())
{ {
case Class.Warrior: case Class.Paladin:
SetPowerType(PowerType.Rage); case Class.Mage:
break;
case Class.Rogue:
SetPowerType(PowerType.Energy);
break;
default:
SetMaxPower(PowerType.Mana, (int)mana); SetMaxPower(PowerType.Mana, (int)mana);
SetPower(PowerType.Mana, (int)mana); SetPower(PowerType.Mana, (int)mana);
break; break;
default: // We don't set max power here, 0 makes power bar hidden
break;
} }
SetModifierValue(UnitMods.Health, UnitModifierType.BaseValue, health); SetModifierValue(UnitMods.Health, UnitModifierType.BaseValue, health);
SetModifierValue(UnitMods.Mana, UnitModifierType.BaseValue, mana);
//Damage //Damage
float basedamage = stats.GenerateBaseDamage(cInfo); float basedamage = stats.GenerateBaseDamage(cInfo);
float weaponBaseMinDamage = basedamage; float weaponBaseMinDamage = basedamage;
float weaponBaseMaxDamage = basedamage * 1.5f; float weaponBaseMaxDamage = basedamage * 1.5f;
SetBaseWeaponDamage(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage, weaponBaseMinDamage); SetBaseWeaponDamage(WeaponAttackType.BaseAttack, WeaponDamageRange.MinDamage, weaponBaseMinDamage);
SetBaseWeaponDamage(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage, weaponBaseMaxDamage); SetBaseWeaponDamage(WeaponAttackType.BaseAttack, WeaponDamageRange.MaxDamage, weaponBaseMaxDamage);
-2
View File
@@ -218,7 +218,6 @@ namespace Game.Entities
SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, (result.Read<bool>(9) ? UnitPetFlags.CanBeAbandoned : UnitPetFlags.CanBeRenamed | UnitPetFlags.CanBeAbandoned)); SetByteFlag(UnitFields.Bytes2, UnitBytes2Offsets.PetFlags, (result.Read<bool>(9) ? UnitPetFlags.CanBeAbandoned : UnitPetFlags.CanBeRenamed | UnitPetFlags.CanBeAbandoned));
SetUInt32Value(UnitFields.Flags, (uint)UnitFlags.PvpAttackable); // this enables popup window (pet abandon, cancel) SetUInt32Value(UnitFields.Flags, (uint)UnitFlags.PvpAttackable); // this enables popup window (pet abandon, cancel)
SetPowerType(PowerType.Focus);
break; break;
default: default:
if (!IsPetGhoul()) if (!IsPetGhoul())
@@ -714,7 +713,6 @@ namespace Game.Entities
if (!Create(map.GenerateLowGuid(HighGuid.Pet), map, cinfo.Entry)) if (!Create(map.GenerateLowGuid(HighGuid.Pet), map, cinfo.Entry))
return false; return false;
SetPowerType(PowerType.Focus);
SetUInt32Value(UnitFields.PetNameTimestamp, 0); SetUInt32Value(UnitFields.PetNameTimestamp, 0);
SetUInt32Value(UnitFields.PetExperience, 0); SetUInt32Value(UnitFields.PetExperience, 0);
SetUInt32Value(UnitFields.PetNextLevelExp, (uint)(Global.ObjectMgr.GetXPForLevel(getLevel() + 1) * PetXPFactor)); SetUInt32Value(UnitFields.PetNextLevelExp, (uint)(Global.ObjectMgr.GetXPForLevel(getLevel() + 1) * PetXPFactor));
+2 -9
View File
@@ -346,8 +346,7 @@ namespace Game.Entities
// apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods() // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
UpdateMaxHealth(); // Update max Health (for add bonus from stamina) UpdateMaxHealth(); // Update max Health (for add bonus from stamina)
SetFullHealth(); SetFullHealth();
if (GetPowerType() == PowerType.Mana) SetFullPower(PowerType.Mana);
SetFullPower(PowerType.Mana);
// original spells // original spells
LearnDefaultSkills(); LearnDefaultSkills();
@@ -4826,8 +4825,6 @@ namespace Game.Entities
pet.SetCreatorGUID(GetGUID()); pet.SetCreatorGUID(GetGUID());
pet.SetUInt32Value(UnitFields.FactionTemplate, getFaction()); pet.SetUInt32Value(UnitFields.FactionTemplate, getFaction());
pet.SetPowerType(PowerType.Mana);
pet.SetUInt64Value(UnitFields.NpcFlags, (uint)NPCFlags.None); pet.SetUInt64Value(UnitFields.NpcFlags, (uint)NPCFlags.None);
pet.SetUInt32Value(UnitFields.Bytes1, 0); pet.SetUInt32Value(UnitFields.Bytes1, 0);
pet.InitStatsForLevel(getLevel()); pet.InitStatsForLevel(getLevel());
@@ -5317,13 +5314,9 @@ namespace Game.Entities
_ApplyAllLevelScaleItemMods(true); // Moved to above SetFullHealth so player will have full health from Heirlooms _ApplyAllLevelScaleItemMods(true); // Moved to above SetFullHealth so player will have full health from Heirlooms
// set current level health and mana/energy to maximum after applying all mods. // Only health and mana are set to maximum.
SetFullHealth(); SetFullHealth();
SetFullPower(PowerType.Mana); SetFullPower(PowerType.Mana);
SetFullPower(PowerType.Energy);
if (GetPower(PowerType.Rage) > GetMaxPower(PowerType.Rage))
SetFullPower(PowerType.Rage);
SetPower(PowerType.Focus, 0);
// update level to hunter/summon pet // update level to hunter/summon pet
Pet pet = GetPet(); Pet pet = GetPet();
+40 -31
View File
@@ -436,29 +436,22 @@ namespace Game.Entities
pet.SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_POWER_TYPE); pet.SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_POWER_TYPE);
}*/ }*/
float powerMultiplier = 1.0f; // Update max power
if (!IsPet()) UpdateMaxPower(powerType);
{
Creature creature = ToCreature();
if (creature)
powerMultiplier = creature.GetCreatureTemplate().ModMana;
}
// Update current power
switch (powerType) switch (powerType)
{ {
default: case PowerType.Mana: // Keep the same (druid form switching...)
case PowerType.Mana: case PowerType.Energy:
break; break;
case PowerType.Rage: case PowerType.Rage: // Reset to zero
SetMaxPower(PowerType.Rage, (int)Math.Ceiling(GetCreatePowers(PowerType.Rage) * powerMultiplier));
SetPower(PowerType.Rage, 0); SetPower(PowerType.Rage, 0);
break; break;
case PowerType.Focus: case PowerType.Focus: // Make it full
SetMaxPower(PowerType.Focus, (int)Math.Ceiling(GetCreatePowers(PowerType.Focus) * powerMultiplier)); SetFullPower(powerType);
SetPower(PowerType.Focus, (int)Math.Ceiling(GetCreatePowers(PowerType.Focus) * powerMultiplier));
break; break;
case PowerType.Energy: default:
SetMaxPower(PowerType.Energy, (int)Math.Ceiling(GetCreatePowers(PowerType.Energy) * powerMultiplier));
break; break;
} }
} }
@@ -549,18 +542,7 @@ namespace Game.Entities
return 0; return 0;
} }
public uint GetPowerIndex(PowerType powerType) public virtual uint GetPowerIndex(PowerType powerType) { return 0; }
{
// This is here because hunter pets are of the warrior class.
// With the current implementation, the core only gives them
// POWER_RAGE, so we enforce the class to hunter so that they
// effectively get focus power.
Class _class = GetClass();
if (IsPet() && ToPet().getPetType() == PetType.Hunter)
_class = Class.Hunter;
return Global.DB2Mgr.GetPowerIndexByClass(powerType, _class);
}
public float GetPowerPct(PowerType powerType) { return GetMaxPower(powerType) != 0 ? 100.0f* GetPower(powerType) / GetMaxPower(powerType) : 0.0f; } public float GetPowerPct(PowerType powerType) { return GetMaxPower(powerType) != 0 ? 100.0f* GetPower(powerType) / GetMaxPower(powerType) : 0.0f; }
public void ApplyResilience(Unit victim, ref uint damage) public void ApplyResilience(Unit victim, ref uint damage)
@@ -1651,8 +1633,16 @@ namespace Game.Entities
return stamina * ratio; return stamina * ratio;
} }
public override uint GetPowerIndex(PowerType powerType)
{
return Global.DB2Mgr.GetPowerIndexByClass(powerType, GetClass());
}
public override void UpdateMaxPower(PowerType power) public override void UpdateMaxPower(PowerType power)
{ {
uint powerIndex = GetPowerIndex(power);
if (powerIndex == (uint)PowerType.Max || powerIndex >= (uint)PowerType.MaxPerClass)
return;
UnitMods unitMod = UnitMods.PowerStart + (int)power; UnitMods unitMod = UnitMods.PowerStart + (int)power;
float value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetCreatePowers(power); float value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetCreatePowers(power);
@@ -1660,7 +1650,7 @@ namespace Game.Entities
value += GetModifierValue(unitMod, UnitModifierType.TotalValue); value += GetModifierValue(unitMod, UnitModifierType.TotalValue);
value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT); value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT);
SetMaxPower(power, (int)value); SetMaxPower(power, (int)Math.Round(value));
} }
public void ApplySpellPenetrationBonus(int amount, bool apply) public void ApplySpellPenetrationBonus(int amount, bool apply)
@@ -1782,12 +1772,31 @@ namespace Game.Entities
SetMaxHealth((uint)value); SetMaxHealth((uint)value);
} }
public override uint GetPowerIndex(PowerType powerType)
{
if (powerType == GetPowerType())
return 0;
if (powerType == PowerType.AlternatePower)
return 1;
if (powerType == PowerType.ComboPoints)
return 2;
return (uint)PowerType.Max;
}
public override void UpdateMaxPower(PowerType power) public override void UpdateMaxPower(PowerType power)
{ {
if (GetPowerIndex(power) == (uint)PowerType.Max)
return;
UnitMods unitMod = UnitMods.PowerStart + (int)power; UnitMods unitMod = UnitMods.PowerStart + (int)power;
float value = GetTotalAuraModValue(unitMod); float value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetCreatePowers(power);
SetMaxPower(power, (int)value); value *= GetModifierValue(unitMod, UnitModifierType.BasePCT);
value += GetModifierValue(unitMod, UnitModifierType.TotalValue);
value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT);
SetMaxPower(power, (int)Math.Round(value));
} }
public override void UpdateAttackPowerAndDamage(bool ranged = false) public override void UpdateAttackPowerAndDamage(bool ranged = false)
+49 -25
View File
@@ -346,10 +346,20 @@ namespace Game.Entities
public void SetFollowAngle(float angle) { m_followAngle = angle; } public void SetFollowAngle(float angle) { m_followAngle = angle; }
public bool IsPetGhoul() { return GetEntry() == 26125; } // Ghoul may be guardian or pet // Warlock pets
public bool IsPetImp() { return GetEntry() == (uint)PetEntry.Imp; }
public bool IsPetFelhunter() { return GetEntry() == (uint)PetEntry.FelHunter; }
public bool IsPetVoidwalker() { return GetEntry() == (uint)PetEntry.VoidWalker; }
public bool IsPetSuccubus() { return GetEntry() == (uint)PetEntry.Succubus; }
public bool IsPetDoomguard() { return GetEntry() == (uint)PetEntry.Doomguard; }
public bool IsPetFelguard() { return GetEntry() == (uint)PetEntry.Felguard; }
public bool IsSpiritWolf() { return GetEntry() == 29264; } // Spirit wolf from feral spirits // Death Knight pets
public bool IsPetGhoul() { return GetEntry() == (uint)PetEntry.Ghoul; } // Ghoul may be guardian or pet
public bool IsPetAbomination() { return GetEntry() == (uint)PetEntry.Abomination; } // Sludge Belcher dk talent
// Shaman pet
public bool IsSpiritWolf() { return GetEntry() == (uint)PetEntry.SpiritWolf; } // Spirit wolf from feral spirits
Unit m_owner; Unit m_owner;
float m_followAngle; float m_followAngle;
@@ -454,13 +464,12 @@ namespace Game.Entities
for (int i = (int)SpellSchools.Holy; i < (int)SpellSchools.Max; ++i) for (int i = (int)SpellSchools.Holy; i < (int)SpellSchools.Max; ++i)
SetModifierValue(UnitMods.ResistanceStart + i, UnitModifierType.BaseValue, cinfo.Resistance[i]); SetModifierValue(UnitMods.ResistanceStart + i, UnitModifierType.BaseValue, cinfo.Resistance[i]);
//health, mana, armor and resistance // Health, Mana or Power, Armor
PetLevelInfo pInfo = Global.ObjectMgr.GetPetLevelInfo(creature_ID, petlevel); PetLevelInfo pInfo = Global.ObjectMgr.GetPetLevelInfo(creature_ID, petlevel);
if (pInfo != null) // exist in DB if (pInfo != null) // exist in DB
{ {
SetCreateHealth(pInfo.health); SetCreateHealth(pInfo.health);
if (petType != PetType.Hunter) //hunter pet use focus SetCreateMana(pInfo.mana);
SetCreateMana(pInfo.mana);
if (pInfo.armor > 0) if (pInfo.armor > 0)
SetModifierValue(UnitMods.Armor, UnitModifierType.BaseValue, pInfo.armor); SetModifierValue(UnitMods.Armor, UnitModifierType.BaseValue, pInfo.armor);
@@ -481,6 +490,17 @@ namespace Game.Entities
SetCreateStat(Stats.Intellect, 28); SetCreateStat(Stats.Intellect, 28);
} }
// Power
if (petType == PetType.Hunter) // Hunter pets have focus
SetPowerType(PowerType.Focus);
else if (IsPetGhoul() || IsPetAbomination()) // DK pets have energy
SetPowerType(PowerType.Energy);
else if (IsPetImp() || IsPetFelhunter() || IsPetVoidwalker() || IsPetSuccubus() || IsPetDoomguard() || IsPetFelguard()) // Warlock pets have energy (since 5.x)
SetPowerType(PowerType.Energy);
else
SetPowerType(PowerType.Mana);
// Damage
SetBonusDamage(0); SetBonusDamage(0);
switch (petType) switch (petType)
{ {
@@ -711,6 +731,8 @@ namespace Game.Entities
public override bool UpdateAllStats() public override bool UpdateAllStats()
{ {
UpdateMaxHealth();
for (var i = Stats.Strength; i < Stats.Max; ++i) for (var i = Stats.Strength; i < Stats.Max; ++i)
UpdateStats(i); UpdateStats(i);
@@ -799,30 +821,14 @@ namespace Game.Entities
public override void UpdateMaxPower(PowerType power) public override void UpdateMaxPower(PowerType power)
{ {
if (GetPowerIndex(power) == (uint)PowerType.Max)
return;
UnitMods unitMod = UnitMods.PowerStart + (int)power; UnitMods unitMod = UnitMods.PowerStart + (int)power;
float addValue = (power == PowerType.Mana) ? GetStat(Stats.Intellect) - GetCreateStat(Stats.Intellect) : 0.0f;
float multiplicator = 15.0f;
switch (GetEntry())
{
case ENTRY_IMP:
multiplicator = 4.95f;
break;
case ENTRY_VOIDWALKER:
case ENTRY_SUCCUBUS:
case ENTRY_FELHUNTER:
case ENTRY_FELGUARD:
multiplicator = 11.5f;
break;
default:
multiplicator = 15.0f;
break;
}
float value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetCreatePowers(power); float value = GetModifierValue(unitMod, UnitModifierType.BaseValue) + GetCreatePowers(power);
value *= GetModifierValue(unitMod, UnitModifierType.BasePCT); value *= GetModifierValue(unitMod, UnitModifierType.BasePCT);
value += GetModifierValue(unitMod, UnitModifierType.TotalValue) + addValue * multiplicator; value += GetModifierValue(unitMod, UnitModifierType.TotalValue);
value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT); value *= GetModifierValue(unitMod, UnitModifierType.TotalPCT);
SetMaxPower(power, (int)value); SetMaxPower(power, (int)value);
@@ -1024,4 +1030,22 @@ namespace Game.Entities
public TempSummonType type; // Summon type, see TempSummonType for available types public TempSummonType type; // Summon type, see TempSummonType for available types
public uint time; // Despawn time, usable only with certain temp summon types public uint time; // Despawn time, usable only with certain temp summon types
} }
enum PetEntry
{
// Warlock pets
Imp = 416,
FelHunter = 691,
VoidWalker = 1860,
Succubus = 1863,
Doomguard = 18540,
Felguard = 30146,
// Death Knight pets
Ghoul = 26125,
Abomination = 106848,
// Shaman pet
SpiritWolf = 29264
}
} }
-4
View File
@@ -213,10 +213,6 @@ namespace Game.Entities
for (UnitMoveType i = 0; i < UnitMoveType.Max; ++i) for (UnitMoveType i = 0; i < UnitMoveType.Max; ++i)
minion.SetSpeedRate(i, m_speed_rate[(int)i]); minion.SetSpeedRate(i, m_speed_rate[(int)i]);
// Ghoul pets have energy instead of mana (is anywhere better place for this code?)
if (minion.IsPetGhoul())
minion.SetPowerType(PowerType.Energy);
// Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(minion.GetUInt32Value(UnitFields.CreatedBySpell)); SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(minion.GetUInt32Value(UnitFields.CreatedBySpell));
if (spellInfo != null && spellInfo.IsCooldownStartedOnEvent()) if (spellInfo != null && spellInfo.IsCooldownStartedOnEvent())
+24 -1
View File
@@ -1941,12 +1941,35 @@ namespace Game.Entities
AuraEffect powerTypeAura = powerTypeAuras.First(); AuraEffect powerTypeAura = powerTypeAuras.First();
displayPower = (PowerType)powerTypeAura.GetMiscValue(); displayPower = (PowerType)powerTypeAura.GetMiscValue();
} }
else else if (GetTypeId() == TypeId.Player)
{ {
ChrClassesRecord cEntry = CliDB.ChrClassesStorage.LookupByKey(GetClass()); ChrClassesRecord cEntry = CliDB.ChrClassesStorage.LookupByKey(GetClass());
if (cEntry != null && cEntry.PowerType < PowerType.Max) if (cEntry != null && cEntry.PowerType < PowerType.Max)
displayPower = cEntry.PowerType; displayPower = cEntry.PowerType;
} }
else if (GetTypeId() == TypeId.Unit)
{
Vehicle vehicle = GetVehicle();
if (vehicle)
{
PowerDisplayRecord powerDisplay = CliDB.PowerDisplayStorage.LookupByKey(vehicle.GetVehicleInfo().PowerDisplayID[0]);
if (powerDisplay != null)
displayPower = (PowerType)powerDisplay.PowerType;
else if (GetClass() == Class.Rogue)
displayPower = PowerType.Energy;
}
else
{
Pet pet = ToPet();
if (pet)
{
if (pet.getPetType() == PetType.Hunter) // Hunter pets have focus
displayPower = PowerType.Focus;
else if (pet.IsPetGhoul() || pet.IsPetAbomination()) // DK pets have energy
displayPower = PowerType.Energy;
}
}
}
break; break;
} }
} }