aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorwin32 <>2010-01-21 13:48:27 +0200
committerwin32 <>2010-01-21 13:48:27 +0200
commit2572e9ef8eacdd5944e8a63cf313c8a3c9ac7faf (patch)
tree9f0fedf87c181ea9a851754e70b3336769bea8f2 /src
parent1c310c887b40c8a415f4eb10c5aa7319c6855f4a (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')
-rw-r--r--src/game/Creature.cpp19
-rw-r--r--src/game/Creature.h30
-rw-r--r--src/game/ObjectMgr.cpp6
-rw-r--r--src/game/StatSystem.cpp4
-rw-r--r--src/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp22
-rw-r--r--src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp7
-rw-r--r--src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp14
-rw-r--r--src/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp7
-rw-r--r--src/scripts/eastern_kingdoms/zulgurub/boss_venoxis.cpp7
-rw-r--r--src/scripts/world/npcs_special.cpp4
-rw-r--r--src/shared/Database/SQLStorage.cpp4
11 files changed, 90 insertions, 34 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);
diff --git a/src/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp b/src/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp
index dcba83ab249..6a40cecacb6 100644
--- a/src/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp
+++ b/src/scripts/eastern_kingdoms/karazhan/boss_prince_malchezaar.cpp
@@ -270,8 +270,11 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
//damage
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, cinfo->mindmg);
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, cinfo->maxdmg);
+ const CreatureBaseStats *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), cinfo->unit_class);
+ float mindmg = stats->GenerateMinDmg(cinfo);
+ float maxdmg = stats->GenerateMaxDmg(cinfo);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, mindmg);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, maxdmg);
m_creature->UpdateDamagePhysical(BASE_ATTACK);
}
@@ -393,15 +396,18 @@ struct TRINITY_DLL_DECL boss_malchezaarAI : public ScriptedAI
//damage
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 2*cinfo->mindmg);
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 2*cinfo->maxdmg);
+ const CreatureBaseStats *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), cinfo->unit_class);
+ float mindmg = stats->GenerateMinDmg(cinfo);
+ float maxdmg = stats->GenerateMaxDmg(cinfo);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, 2 * mindmg);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, 2 * maxdmg);
m_creature->UpdateDamagePhysical(BASE_ATTACK);
- m_creature->SetBaseWeaponDamage(OFF_ATTACK, MINDAMAGE, cinfo->mindmg);
- m_creature->SetBaseWeaponDamage(OFF_ATTACK, MAXDAMAGE, cinfo->maxdmg);
+ m_creature->SetBaseWeaponDamage(OFF_ATTACK, MINDAMAGE, mindmg);
+ m_creature->SetBaseWeaponDamage(OFF_ATTACK, MAXDAMAGE, maxdmg);
//Sigh, updating only works on main attack, do it manually ....
- m_creature->SetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, cinfo->mindmg);
- m_creature->SetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, cinfo->maxdmg);
+ m_creature->SetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE, mindmg);
+ m_creature->SetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, maxdmg);
m_creature->SetAttackTime(OFF_ATTACK, (m_creature->GetAttackTime(BASE_ATTACK)*150)/100);
}
diff --git a/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp b/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp
index 7cea97bb7c2..05ab5c81447 100644
--- a/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp
+++ b/src/scripts/eastern_kingdoms/zulgurub/boss_arlokk.cpp
@@ -234,8 +234,11 @@ struct TRINITY_DLL_DECL boss_arlokkAI : public ScriptedAI
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
+ const CreatureBaseStats *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), cinfo->unit_class);
+ float mindmg = stats->GenerateMinDmg(cinfo);
+ float maxdmg = stats->GenerateMaxDmg(cinfo);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (mindmg +((mindmg/100) * 35)));
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (maxdmg +((maxdmg/100) * 35)));
m_creature->UpdateDamagePhysical(BASE_ATTACK);
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
diff --git a/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp b/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp
index e4b12ffb972..e240ae5db9a 100644
--- a/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp
+++ b/src/scripts/eastern_kingdoms/zulgurub/boss_marli.cpp
@@ -145,8 +145,11 @@ struct TRINITY_DLL_DECL boss_marliAI : public ScriptedAI
DoScriptText(SAY_TRANSFORM, m_creature);
DoCast(m_creature, SPELL_SPIDER_FORM);
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35)));
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35)));
+ const CreatureBaseStats *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), cinfo->unit_class);
+ float mindmg = stats->GenerateMinDmg(cinfo);
+ float maxdmg = stats->GenerateMaxDmg(cinfo);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (mindmg +((mindmg/100) * 35)));
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (maxdmg +((maxdmg/100) * 35)));
m_creature->UpdateDamagePhysical(BASE_ATTACK);
DoCast(m_creature->getVictim(), SPELL_ENVOLWINGWEB);
@@ -185,8 +188,11 @@ struct TRINITY_DLL_DECL boss_marliAI : public ScriptedAI
{
m_creature->SetDisplayId(15220);
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1)));
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1)));
+ const CreatureBaseStats *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), cinfo->unit_class);
+ float mindmg = stats->GenerateMinDmg(cinfo);
+ float maxdmg = stats->GenerateMaxDmg(cinfo);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (mindmg +((mindmg/100) * 1)));
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (maxdmg +((maxdmg/100) * 1)));
m_creature->UpdateDamagePhysical(BASE_ATTACK);
PhaseTwo = false;
diff --git a/src/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp b/src/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp
index e7002673cd3..3f8b49c8970 100644
--- a/src/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp
+++ b/src/scripts/eastern_kingdoms/zulgurub/boss_thekal.cpp
@@ -185,8 +185,11 @@ struct TRINITY_DLL_DECL boss_thekalAI : public ScriptedAI
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
m_creature->SetHealth(int(m_creature->GetMaxHealth()*1.0));
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40)));
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40)));
+ const CreatureBaseStats *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), cinfo->unit_class);
+ float mindmg = stats->GenerateMinDmg(cinfo);
+ float maxdmg = stats->GenerateMaxDmg(cinfo);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (mindmg +((mindmg/100) * 40)));
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (maxdmg +((maxdmg/100) * 40)));
m_creature->UpdateDamagePhysical(BASE_ATTACK);
DoResetThreat();
PhaseTwo = true;
diff --git a/src/scripts/eastern_kingdoms/zulgurub/boss_venoxis.cpp b/src/scripts/eastern_kingdoms/zulgurub/boss_venoxis.cpp
index 3b094b74b1e..5ea03ab4615 100644
--- a/src/scripts/eastern_kingdoms/zulgurub/boss_venoxis.cpp
+++ b/src/scripts/eastern_kingdoms/zulgurub/boss_venoxis.cpp
@@ -148,8 +148,11 @@ struct TRINITY_DLL_DECL boss_venoxisAI : public ScriptedAI
DoCast(m_creature, SPELL_SNAKE_FORM);
m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X, 2.00f);
const CreatureInfo *cinfo = m_creature->GetCreatureInfo();
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 25)));
- m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 25)));
+ const CreatureBaseStats *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), cinfo->unit_class);
+ float mindmg = stats->GenerateMinDmg(cinfo);
+ float maxdmg = stats->GenerateMaxDmg(cinfo);
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (mindmg +((mindmg/100) * 25)));
+ m_creature->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (maxdmg +((maxdmg/100) * 25)));
m_creature->UpdateDamagePhysical(BASE_ATTACK);
DoResetThreat();
PhaseTwo = true;
diff --git a/src/scripts/world/npcs_special.cpp b/src/scripts/world/npcs_special.cpp
index a57507f9c6a..93e68d074e1 100644
--- a/src/scripts/world/npcs_special.cpp
+++ b/src/scripts/world/npcs_special.cpp
@@ -1580,6 +1580,7 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
SpellTimer = 0;
CreatureInfo const *Info = m_creature->GetCreatureInfo();
+ CreatureBaseStats const *stats = ((CreatureBaseStats*)m_creature)->GetBaseStats(m_creature->getLevel(), Info->unit_class);
if (Info->Entry == C_VIPER)
IsViper = true;
@@ -1588,8 +1589,9 @@ struct TRINITY_DLL_DECL npc_snake_trap_serpentsAI : public ScriptedAI
//Add delta to make them not all hit the same time
uint32 delta = (rand() % 7) * 100;
+ float attackpower = stats->GenerateAttackPower(Info);
m_creature->SetStatFloatValue(UNIT_FIELD_BASEATTACKTIME, Info->baseattacktime + delta);
- m_creature->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER , Info->attackpower);
+ m_creature->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER , attackpower);
}
//Redefined for random target selection:
diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp
index e36297ed35b..efe00b9c0f6 100644
--- a/src/shared/Database/SQLStorage.cpp
+++ b/src/shared/Database/SQLStorage.cpp
@@ -27,8 +27,8 @@ extern DatabasePostgre WorldDatabase;
extern DatabaseMysql WorldDatabase;
#endif
-const char CreatureInfosrcfmt[]="iiiiiiiiiisssiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiis";
-const char CreatureInfodstfmt[]="iiiiiiiiiisssiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiii";
+const char CreatureInfosrcfmt[]="iiiiiiiiiisssiiiiiiiffiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiifffffliiiiiiiliiis";
+const char CreatureInfodstfmt[]="iiiiiiiiiisssiiiiiiiffiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiifffffliiiiiiiliiii";
const char CreatureDataAddonInfofmt[]="iiiiiis";
const char CreatureModelfmt[]="iffbi";
const char CreatureInfoAddonInfofmt[]="iiiiiis";