* 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
This commit is contained in:
win32
2010-01-21 13:48:27 +02:00
parent 1c310c887b
commit 2572e9ef8e
13 changed files with 507 additions and 34 deletions
+14 -5
View File
@@ -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)
+24 -6
View File
@@ -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);
};
+5 -1
View File
@@ -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;
+3 -1
View File
@@ -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);