diff options
| author | win32 <> | 2010-01-21 13:48:27 +0200 |
|---|---|---|
| committer | win32 <> | 2010-01-21 13:48:27 +0200 |
| commit | 2572e9ef8eacdd5944e8a63cf313c8a3c9ac7faf (patch) | |
| tree | 9f0fedf87c181ea9a851754e70b3336769bea8f2 /src/game | |
| parent | 1c310c887b40c8a415f4eb10c5aa7319c6855f4a (diff) | |
* Add support for basedmg and baserangeddmg values in creature_classlevelstats.
* Remove mindmg, maxdmg, attackpower and ranged field in creature_template and add Dmg_Mod, Rangeddmg_Mod field.
--HG--
branch : trunk
Diffstat (limited to 'src/game')
| -rw-r--r-- | src/game/Creature.cpp | 19 | ||||
| -rw-r--r-- | src/game/Creature.h | 30 | ||||
| -rw-r--r-- | src/game/ObjectMgr.cpp | 6 | ||||
| -rw-r--r-- | src/game/StatSystem.cpp | 4 |
4 files changed, 46 insertions, 13 deletions
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 29ed9983cd2..4b6e8186801 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1107,15 +1107,24 @@ void Creature::SelectLevel(const CreatureInfo *cinfo) //damage float damagemod = 1.0f;//_GetDamageMod(rank); + float mindmg = stats->GenerateMinDmg(cinfo); + float maxdmg = stats->GenerateMaxDmg(cinfo); + float attackpower = stats->GenerateAttackPower(cinfo); - SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, cinfo->mindmg * damagemod); - SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, cinfo->maxdmg * damagemod); + SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, mindmg * damagemod); + SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, maxdmg * damagemod); - SetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE,cinfo->minrangedmg * damagemod); - SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE,cinfo->maxrangedmg * damagemod); + SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, attackpower * damagemod); - SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, cinfo->attackpower * damagemod); + // ranged damage + float minrangeddmg = stats->GenerateRangedDmg(cinfo) / 2.5f; + float maxrangeddmg = stats->GenerateRangedDmg(cinfo) - mindmg; + float rangedattackpower = (minrangeddmg + maxrangeddmg) / 2 * 0.3; + SetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, minrangeddmg * damagemod); + SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, maxrangeddmg * damagemod); + + SetModifierValue(UNIT_MOD_ATTACK_POWER_RANGED, BASE_VALUE, rangedattackpower * damagemod); } float Creature::_GetHealthMod(int32 Rank) diff --git a/src/game/Creature.h b/src/game/Creature.h index ad8dfc2b01c..d3bee8d2eca 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -89,10 +89,7 @@ struct CreatureInfo float speed; float scale; uint32 rank; - float mindmg; - float maxdmg; uint32 dmgschool; - uint32 attackpower; float dmg_multiplier; uint32 baseattacktime; uint32 rangeattacktime; @@ -104,9 +101,6 @@ struct CreatureInfo uint32 trainer_spell; uint32 trainer_class; uint32 trainer_race; - float minrangedmg; - float maxrangedmg; - uint32 rangedattackpower; uint32 type; // enum CreatureType values uint32 type_flags; // enum CreatureTypeFlags mask values uint32 lootid; @@ -129,6 +123,8 @@ struct CreatureInfo float ModHealth; float ModMana; float ModArmor; + float ModDmg; + float ModRangedDmg; bool RacialLeader; uint32 questItems[6]; uint32 movementId; @@ -175,6 +171,8 @@ struct TRINITY_DLL_SPEC CreatureBaseStats uint32 BaseHealth[MAX_CREATURE_BASE_HP]; uint32 BaseMana; uint32 BaseArmor; + uint32 BaseDmg; + uint32 BaseRangedDmg; // Helpers @@ -197,6 +195,26 @@ struct TRINITY_DLL_SPEC CreatureBaseStats return uint32((BaseArmor * info->ModArmor) + 0.5f); } + uint32 GenerateMinDmg(CreatureInfo const* info) const + { + return uint32((BaseDmg * (info->baseattacktime / 1000.0f) / 2.5f) * info->ModDmg + 0.5f); + } + + uint32 GenerateMaxDmg(CreatureInfo const* info) const + { + return uint32((BaseDmg * (info->baseattacktime / 1000) - GenerateMinDmg(info)) * info->ModDmg + 0.5f); + } + + uint32 GenerateAttackPower(CreatureInfo const* info) const + { + return uint32(((GenerateMinDmg(info) + GenerateMaxDmg(info)) / 2.0f * 0.3f) * info->ModDmg + 0.5f); + } + + uint32 GenerateRangedDmg(CreatureInfo const* info) const + { + return uint32((BaseDmg * (info->baseattacktime / 1000.0f) * info->ModRangedDmg) + 0.5f); + } + static CreatureBaseStats const* GetBaseStats(uint32 level, uint8 unitClass); }; diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 7c2c2e6a658..3416fcff41d 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -8917,7 +8917,7 @@ CreatureBaseStats const* ObjectMgr::GetCreatureBaseStats(uint32 level, uint8 uni void ObjectMgr::LoadCreatureClassLevelStats() { - QueryResult *result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor FROM creature_classlevelstats"); + QueryResult *result = WorldDatabase.Query("SELECT level, class, basehp0, basehp1, basehp2, basemana, basearmor, basedmg, baserangeddmg FROM creature_classlevelstats"); if (!result) { @@ -8941,6 +8941,8 @@ void ObjectMgr::LoadCreatureClassLevelStats() stats.BaseHealth[i] = fields[i + 2].GetUInt32(); stats.BaseMana = fields[5].GetUInt32(); stats.BaseArmor = fields[6].GetUInt32(); + stats.BaseDmg = fields[7].GetUInt32(); + stats.BaseRangedDmg = fields[8].GetUInt32(); if (stats.Level > STRONG_MAX_LEVEL) { @@ -8987,6 +8989,8 @@ void ObjectMgr::LoadCreatureClassLevelStats() CreatureBaseStats new_stats = CreatureBaseStats(); new_stats.BaseArmor = 1; + new_stats.BaseDmg = 1; + new_stats.BaseRangedDmg = 1; for (uint8 j = 0; j < MAX_CREATURE_BASE_HP; ++j) new_stats.BaseHealth[j] = 1; new_stats.BaseMana = 0; diff --git a/src/game/StatSystem.cpp b/src/game/StatSystem.cpp index 7197779fdfd..b5895fbb2e6 100644 --- a/src/game/StatSystem.cpp +++ b/src/game/StatSystem.cpp @@ -25,6 +25,7 @@ #include "SharedDefines.h" #include "SpellAuras.h" #include "SpellAuraEffects.h" +#include "ObjectMgr.h" /*####################################### ######## ######## @@ -865,7 +866,8 @@ void Creature::UpdateDamagePhysical(WeaponAttackType attType) float weapon_maxdamage = GetWeaponDamageRange(attType, MAXDAMAGE); /* difference in AP between current attack power and base value from DB */ - float att_pwr_change = GetTotalAttackPowerValue(attType) - GetCreatureInfo()->attackpower; + CreatureBaseStats const* stats = objmgr.GetCreatureBaseStats(getLevel(), GetCreatureInfo()->unit_class); + float att_pwr_change = GetTotalAttackPowerValue(attType) - stats->GenerateAttackPower(GetCreatureInfo()); float base_value = GetModifierValue(unitMod, BASE_VALUE) + (att_pwr_change * GetAPMultiplier(attType, false) / 14.0f); float base_pct = GetModifierValue(unitMod, BASE_PCT); float total_value = GetModifierValue(unitMod, TOTAL_VALUE); |
