mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-14 03:11:28 +00:00
[Quest API] Add Archetype Methods to Perl/Lua (#4181)
* [Quest API] Add Archetype Methods to Perl/Lua - Add `$mob->GetArchetypeName()`. - Add `$mob->IsIntelligenceCasterClass()`. - Add `$mob->IsPureMeleeClass()`. - Add `$mob->IsWisdomCasterClass()`. - Add `mob:GetArchetypeName()`. - Add `mob:IsIntelligenceCasterClass()`. - Add `mob:IsPureMeleeClass()`. - Add `mob:IsWisdomCasterClass()`. - Allows operators to use mob archetypes to perform different operations. - Add a namespace for archetypes instead of constants. - Utilize `IsIntelligenceCasterClass()`, `IsPureMeleeClass()`, and `IsWisdomCasterClass()` where necessary. - * Update mob.cpp
This commit is contained in:
parent
d2372de982
commit
abdec39cdd
205
zone/bot.cpp
205
zone/bot.cpp
@ -2287,7 +2287,7 @@ bool Bot::TryMeditate() {
|
|||||||
if (!IsMoving() && !spellend_timer.Enabled()) {
|
if (!IsMoving() && !spellend_timer.Enabled()) {
|
||||||
if (GetTarget() && AI_EngagedCastCheck()) {
|
if (GetTarget() && AI_EngagedCastCheck()) {
|
||||||
BotMeditate(false);
|
BotMeditate(false);
|
||||||
} else if (GetArchetype() == ARCHETYPE_CASTER) {
|
} else if (GetArchetype() == Archetype::Caster) {
|
||||||
BotMeditate(true);
|
BotMeditate(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2755,7 +2755,7 @@ Mob* Bot::GetBotTarget(Client* bot_owner)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetArchetype() == ARCHETYPE_CASTER) {
|
if (GetArchetype() == Archetype::Caster) {
|
||||||
BotMeditate(true);
|
BotMeditate(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5189,31 +5189,26 @@ void Bot::ProcessBotOwnerRefDelete(Mob* botOwner) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 Bot::CalcMaxMana() {
|
int64 Bot::CalcMaxMana()
|
||||||
switch(GetCasterClass()) {
|
{
|
||||||
case 'I':
|
if (IsIntelligenceCasterClass() || IsWisdomCasterClass()) {
|
||||||
max_mana = (GenerateBaseManaPoints() + itembonuses.Mana + spellbonuses.Mana + aabonuses.Mana + GroupLeadershipAAManaEnhancement());
|
max_mana = (
|
||||||
max_mana += itembonuses.heroic_max_mana;
|
GenerateBaseManaPoints() +
|
||||||
case 'W': {
|
itembonuses.Mana +
|
||||||
max_mana = (GenerateBaseManaPoints() + itembonuses.Mana + spellbonuses.Mana + aabonuses.Mana + GroupLeadershipAAManaEnhancement());
|
spellbonuses.Mana +
|
||||||
max_mana += itembonuses.heroic_max_mana;
|
aabonuses.Mana +
|
||||||
break;
|
GroupLeadershipAAManaEnhancement()
|
||||||
}
|
);
|
||||||
case 'N': {
|
max_mana += itembonuses.heroic_max_mana;
|
||||||
max_mana = 0;
|
} else {
|
||||||
break;
|
max_mana = 0;
|
||||||
}
|
|
||||||
default: {
|
|
||||||
LogDebug("Invalid Class [{}] in CalcMaxMana", GetCasterClass());
|
|
||||||
max_mana = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_mana > max_mana)
|
if (current_mana > max_mana) {
|
||||||
current_mana = max_mana;
|
current_mana = max_mana;
|
||||||
else if (max_mana < 0)
|
} else if (max_mana < 0) {
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return max_mana;
|
return max_mana;
|
||||||
}
|
}
|
||||||
@ -5528,87 +5523,107 @@ bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 Bot::GenerateBaseManaPoints() {
|
int32 Bot::GenerateBaseManaPoints()
|
||||||
int32 bot_mana = 0;
|
{
|
||||||
int32 WisInt = 0;
|
int32 bot_mana = 0;
|
||||||
|
int32 WisInt = 0;
|
||||||
int32 MindLesserFactor, MindFactor;
|
int32 MindLesserFactor, MindFactor;
|
||||||
int wisint_mana = 0;
|
int wisint_mana = 0;
|
||||||
int base_mana = 0;
|
int base_mana = 0;
|
||||||
int ConvertedWisInt = 0;
|
int ConvertedWisInt = 0;
|
||||||
switch(GetCasterClass()) {
|
|
||||||
case 'I':
|
|
||||||
WisInt = INT;
|
|
||||||
if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) {
|
|
||||||
if (WisInt > 100) {
|
|
||||||
ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100);
|
|
||||||
if (WisInt > 201)
|
|
||||||
ConvertedWisInt -= ((WisInt - 201) * 5 / 4);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ConvertedWisInt = WisInt;
|
|
||||||
|
|
||||||
if (GetLevel() < 41) {
|
if (IsIntelligenceCasterClass()) {
|
||||||
wisint_mana = (GetLevel() * 75 * ConvertedWisInt / 1000);
|
WisInt = INT;
|
||||||
base_mana = (GetLevel() * 15);
|
|
||||||
} else if (GetLevel() < 81) {
|
if (
|
||||||
wisint_mana = ((3 * ConvertedWisInt) + ((GetLevel() - 40) * 15 * ConvertedWisInt / 100));
|
GetOwner() &&
|
||||||
base_mana = (600 + ((GetLevel() - 40) * 30));
|
GetOwner()->CastToClient() &&
|
||||||
} else {
|
GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD &&
|
||||||
wisint_mana = (9 * ConvertedWisInt);
|
RuleB(Character, SoDClientUseSoDHPManaEnd)
|
||||||
base_mana = (1800 + ((GetLevel() - 80) * 18));
|
) {
|
||||||
|
if (WisInt > 100) {
|
||||||
|
ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100);
|
||||||
|
if (WisInt > 201) {
|
||||||
|
ConvertedWisInt -= ((WisInt - 201) * 5 / 4);
|
||||||
}
|
}
|
||||||
bot_mana = (base_mana + wisint_mana);
|
|
||||||
} else {
|
} else {
|
||||||
if (((WisInt - 199) / 2) > 0)
|
ConvertedWisInt = WisInt;
|
||||||
MindLesserFactor = ((WisInt - 199) / 2);
|
|
||||||
else
|
|
||||||
MindLesserFactor = 0;
|
|
||||||
|
|
||||||
MindFactor = WisInt - MindLesserFactor;
|
|
||||||
if (WisInt > 100)
|
|
||||||
bot_mana = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
|
||||||
else
|
|
||||||
bot_mana = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case 'W':
|
|
||||||
WisInt = WIS;
|
|
||||||
if (GetOwner() && GetOwner()->CastToClient() && GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD && RuleB(Character, SoDClientUseSoDHPManaEnd)) {
|
|
||||||
if (WisInt > 100) {
|
|
||||||
ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100);
|
|
||||||
if (WisInt > 201)
|
|
||||||
ConvertedWisInt -= ((WisInt - 201) * 5 / 4);
|
|
||||||
} else
|
|
||||||
ConvertedWisInt = WisInt;
|
|
||||||
|
|
||||||
if (GetLevel() < 41) {
|
if (GetLevel() < 41) {
|
||||||
wisint_mana = (GetLevel() * 75 * ConvertedWisInt / 1000);
|
wisint_mana = (GetLevel() * 75 * ConvertedWisInt / 1000);
|
||||||
base_mana = (GetLevel() * 15);
|
base_mana = (GetLevel() * 15);
|
||||||
} else if (GetLevel() < 81) {
|
} else if (GetLevel() < 81) {
|
||||||
wisint_mana = ((3 * ConvertedWisInt) + ((GetLevel() - 40) * 15 * ConvertedWisInt / 100));
|
wisint_mana = ((3 * ConvertedWisInt) + ((GetLevel() - 40) * 15 * ConvertedWisInt / 100));
|
||||||
base_mana = (600 + ((GetLevel() - 40) * 30));
|
base_mana = (600 + ((GetLevel() - 40) * 30));
|
||||||
} else {
|
|
||||||
wisint_mana = (9 * ConvertedWisInt);
|
|
||||||
base_mana = (1800 + ((GetLevel() - 80) * 18));
|
|
||||||
}
|
|
||||||
bot_mana = (base_mana + wisint_mana);
|
|
||||||
} else {
|
} else {
|
||||||
if (((WisInt - 199) / 2) > 0)
|
wisint_mana = (9 * ConvertedWisInt);
|
||||||
MindLesserFactor = ((WisInt - 199) / 2);
|
base_mana = (1800 + ((GetLevel() - 80) * 18));
|
||||||
else
|
|
||||||
MindLesserFactor = 0;
|
|
||||||
|
|
||||||
MindFactor = (WisInt - MindLesserFactor);
|
|
||||||
if (WisInt > 100)
|
|
||||||
bot_mana = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
|
||||||
else
|
|
||||||
bot_mana = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
default:
|
bot_mana = (base_mana + wisint_mana);
|
||||||
bot_mana = 0;
|
} else {
|
||||||
break;
|
if (((WisInt - 199) / 2) > 0) {
|
||||||
|
MindLesserFactor = ((WisInt - 199) / 2);
|
||||||
|
} else {
|
||||||
|
MindLesserFactor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MindFactor = WisInt - MindLesserFactor;
|
||||||
|
if (WisInt > 100) {
|
||||||
|
bot_mana = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
||||||
|
} else {
|
||||||
|
bot_mana = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (IsWisdomCasterClass()) {
|
||||||
|
WisInt = WIS;
|
||||||
|
|
||||||
|
if (
|
||||||
|
GetOwner() &&
|
||||||
|
GetOwner()->CastToClient() &&
|
||||||
|
GetOwner()->CastToClient()->ClientVersion() >= EQ::versions::ClientVersion::SoD &&
|
||||||
|
RuleB(Character, SoDClientUseSoDHPManaEnd)
|
||||||
|
) {
|
||||||
|
if (WisInt > 100) {
|
||||||
|
ConvertedWisInt = (((WisInt - 100) * 5 / 2) + 100);
|
||||||
|
if (WisInt > 201) {
|
||||||
|
ConvertedWisInt -= ((WisInt - 201) * 5 / 4);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ConvertedWisInt = WisInt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetLevel() < 41) {
|
||||||
|
wisint_mana = (GetLevel() * 75 * ConvertedWisInt / 1000);
|
||||||
|
base_mana = (GetLevel() * 15);
|
||||||
|
} else if (GetLevel() < 81) {
|
||||||
|
wisint_mana = ((3 * ConvertedWisInt) + ((GetLevel() - 40) * 15 * ConvertedWisInt / 100));
|
||||||
|
base_mana = (600 + ((GetLevel() - 40) * 30));
|
||||||
|
} else {
|
||||||
|
wisint_mana = (9 * ConvertedWisInt);
|
||||||
|
base_mana = (1800 + ((GetLevel() - 80) * 18));
|
||||||
|
}
|
||||||
|
|
||||||
|
bot_mana = (base_mana + wisint_mana);
|
||||||
|
} else {
|
||||||
|
if (((WisInt - 199) / 2) > 0) {
|
||||||
|
MindLesserFactor = ((WisInt - 199) / 2);
|
||||||
|
} else {
|
||||||
|
MindLesserFactor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MindFactor = (WisInt - MindLesserFactor);
|
||||||
|
if (WisInt > 100) {
|
||||||
|
bot_mana = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
||||||
|
} else {
|
||||||
|
bot_mana = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
bot_mana = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
max_mana = bot_mana;
|
max_mana = bot_mana;
|
||||||
return bot_mana;
|
return bot_mana;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -591,7 +591,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
|||||||
//Only check archetype if spell is not a group spell
|
//Only check archetype if spell is not a group spell
|
||||||
//Hybrids get all buffs
|
//Hybrids get all buffs
|
||||||
switch (tar->GetArchetype()) {
|
switch (tar->GetArchetype()) {
|
||||||
case ARCHETYPE_CASTER:
|
case Archetype::Caster:
|
||||||
//TODO: probably more caster specific spell effects in here
|
//TODO: probably more caster specific spell effects in here
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
@ -606,7 +606,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ARCHETYPE_MELEE:
|
case Archetype::Melee:
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
IsEffectInSpell(s.SpellId, SE_IncreaseSpellHaste) ||
|
IsEffectInSpell(s.SpellId, SE_IncreaseSpellHaste) ||
|
||||||
@ -899,7 +899,7 @@ bool Bot::BotCastBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
|||||||
|
|
||||||
switch (tar->GetArchetype())
|
switch (tar->GetArchetype())
|
||||||
{
|
{
|
||||||
case ARCHETYPE_CASTER:
|
case Archetype::Caster:
|
||||||
//TODO: probably more caster specific spell effects in here
|
//TODO: probably more caster specific spell effects in here
|
||||||
if (IsEffectInSpell(s.SpellId, SE_AttackSpeed) || IsEffectInSpell(s.SpellId, SE_ATK) ||
|
if (IsEffectInSpell(s.SpellId, SE_AttackSpeed) || IsEffectInSpell(s.SpellId, SE_ATK) ||
|
||||||
IsEffectInSpell(s.SpellId, SE_STR) || IsEffectInSpell(s.SpellId, SE_ReverseDS))
|
IsEffectInSpell(s.SpellId, SE_STR) || IsEffectInSpell(s.SpellId, SE_ReverseDS))
|
||||||
@ -907,7 +907,7 @@ bool Bot::BotCastBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ARCHETYPE_MELEE:
|
case Archetype::Melee:
|
||||||
if (IsEffectInSpell(s.SpellId, SE_IncreaseSpellHaste) || IsEffectInSpell(s.SpellId, SE_ManaPool) ||
|
if (IsEffectInSpell(s.SpellId, SE_IncreaseSpellHaste) || IsEffectInSpell(s.SpellId, SE_ManaPool) ||
|
||||||
IsEffectInSpell(s.SpellId, SE_CastingLevel) || IsEffectInSpell(s.SpellId, SE_ManaRegen_v2) ||
|
IsEffectInSpell(s.SpellId, SE_CastingLevel) || IsEffectInSpell(s.SpellId, SE_ManaRegen_v2) ||
|
||||||
IsEffectInSpell(s.SpellId, SE_CurrentMana))
|
IsEffectInSpell(s.SpellId, SE_CurrentMana))
|
||||||
|
|||||||
@ -523,28 +523,26 @@ int32 Client::GetRawItemAC()
|
|||||||
|
|
||||||
int64 Client::CalcMaxMana()
|
int64 Client::CalcMaxMana()
|
||||||
{
|
{
|
||||||
switch (GetCasterClass()) {
|
if (IsIntelligenceCasterClass() || IsWisdomCasterClass()) {
|
||||||
case 'I':
|
max_mana = (
|
||||||
case 'W': {
|
CalcBaseMana() +
|
||||||
max_mana = (CalcBaseMana() + itembonuses.Mana + spellbonuses.Mana + aabonuses.Mana + GroupLeadershipAAManaEnhancement());
|
itembonuses.Mana +
|
||||||
break;
|
spellbonuses.Mana +
|
||||||
}
|
aabonuses.Mana +
|
||||||
case 'N': {
|
GroupLeadershipAAManaEnhancement()
|
||||||
max_mana = 0;
|
);
|
||||||
break;
|
} else {
|
||||||
}
|
max_mana = 0;
|
||||||
default: {
|
|
||||||
LogSpells("Invalid Class [{}] in CalcMaxMana", GetCasterClass());
|
|
||||||
max_mana = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_mana < 0) {
|
if (max_mana < 0) {
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_mana > max_mana) {
|
if (current_mana > max_mana) {
|
||||||
current_mana = max_mana;
|
current_mana = max_mana;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mana_perc_cap = spellbonuses.ManaPercCap[SBIndex::RESOURCE_PERCENT_CAP];
|
int mana_perc_cap = spellbonuses.ManaPercCap[SBIndex::RESOURCE_PERCENT_CAP];
|
||||||
if (mana_perc_cap) {
|
if (mana_perc_cap) {
|
||||||
int curMana_cap = (max_mana * mana_perc_cap) / 100;
|
int curMana_cap = (max_mana * mana_perc_cap) / 100;
|
||||||
@ -552,96 +550,90 @@ int64 Client::CalcMaxMana()
|
|||||||
current_mana = curMana_cap;
|
current_mana = curMana_cap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LogSpells("for [{}] returning [{}]", GetName(), max_mana);
|
LogSpells("for [{}] returning [{}]", GetName(), max_mana);
|
||||||
return max_mana;
|
return max_mana;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 Client::CalcBaseMana()
|
int64 Client::CalcBaseMana()
|
||||||
{
|
{
|
||||||
int ConvertedWisInt = 0;
|
int ConvertedWisInt = 0;
|
||||||
int MindLesserFactor, MindFactor;
|
int MindLesserFactor, MindFactor;
|
||||||
int WisInt = 0;
|
int WisInt = 0;
|
||||||
int64 base_mana = 0;
|
int64 base_mana = 0;
|
||||||
int wisint_mana = 0;
|
int wisint_mana = 0;
|
||||||
int64 max_m = 0;
|
int64 max_m = 0;
|
||||||
switch (GetCasterClass()) {
|
|
||||||
case 'I':
|
if (IsIntelligenceCasterClass()) {
|
||||||
WisInt = GetINT();
|
WisInt = GetINT();
|
||||||
if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) {
|
|
||||||
ConvertedWisInt = WisInt;
|
if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) {
|
||||||
int over200 = WisInt;
|
ConvertedWisInt = WisInt;
|
||||||
if (WisInt > 100) {
|
|
||||||
if (WisInt > 200) {
|
int over200 = WisInt;
|
||||||
over200 = (WisInt - 200) / -2 + WisInt;
|
if (WisInt > 100) {
|
||||||
}
|
if (WisInt > 200) {
|
||||||
ConvertedWisInt = (3 * over200 - 300) / 2 + over200;
|
over200 = (WisInt - 200) / -2 + WisInt;
|
||||||
}
|
|
||||||
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
|
|
||||||
if (base_data.level == GetLevel()) {
|
|
||||||
max_m = base_data.mana + (ConvertedWisInt * base_data.mana_fac) + itembonuses.heroic_max_mana;
|
|
||||||
}
|
}
|
||||||
|
ConvertedWisInt = (3 * over200 - 300) / 2 + over200;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if ((( WisInt - 199 ) / 2) > 0) {
|
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
|
||||||
MindLesserFactor = ( WisInt - 199 ) / 2;
|
if (base_data.level == GetLevel()) {
|
||||||
}
|
max_m = base_data.mana + (ConvertedWisInt * base_data.mana_fac) + itembonuses.heroic_max_mana;
|
||||||
else {
|
|
||||||
MindLesserFactor = 0;
|
|
||||||
}
|
|
||||||
MindFactor = WisInt - MindLesserFactor;
|
|
||||||
if (WisInt > 100) {
|
|
||||||
max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
} else {
|
||||||
case 'W':
|
if (((WisInt - 199) / 2) > 0) {
|
||||||
WisInt = GetWIS();
|
MindLesserFactor = (WisInt - 199) / 2;
|
||||||
if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) {
|
} else {
|
||||||
ConvertedWisInt = WisInt;
|
MindLesserFactor = 0;
|
||||||
int over200 = WisInt;
|
|
||||||
if (WisInt > 100) {
|
|
||||||
if (WisInt > 200) {
|
|
||||||
over200 = (WisInt - 200) / -2 + WisInt;
|
|
||||||
}
|
|
||||||
ConvertedWisInt = (3 * over200 - 300) / 2 + over200;
|
|
||||||
}
|
|
||||||
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
|
|
||||||
if (base_data.level == GetLevel()) {
|
|
||||||
max_m = base_data.mana + (ConvertedWisInt * base_data.mana_fac) + itembonuses.heroic_max_mana;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
if ((( WisInt - 199 ) / 2) > 0) {
|
MindFactor = WisInt - MindLesserFactor;
|
||||||
MindLesserFactor = ( WisInt - 199 ) / 2;
|
|
||||||
}
|
if (WisInt > 100) {
|
||||||
else {
|
max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
||||||
MindLesserFactor = 0;
|
} else {
|
||||||
}
|
max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
||||||
MindFactor = WisInt - MindLesserFactor;
|
|
||||||
if (WisInt > 100) {
|
|
||||||
max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
case 'N': {
|
} else if (IsWisdomCasterClass()) {
|
||||||
max_m = 0;
|
WisInt = GetWIS();
|
||||||
break;
|
|
||||||
|
if (ClientVersion() >= EQ::versions::ClientVersion::SoF && RuleB(Character, SoDClientUseSoDHPManaEnd)) {
|
||||||
|
ConvertedWisInt = WisInt;
|
||||||
|
|
||||||
|
int over200 = WisInt;
|
||||||
|
if (WisInt > 100) {
|
||||||
|
if (WisInt > 200) {
|
||||||
|
over200 = (WisInt - 200) / -2 + WisInt;
|
||||||
|
}
|
||||||
|
ConvertedWisInt = (3 * over200 - 300) / 2 + over200;
|
||||||
}
|
}
|
||||||
default: {
|
|
||||||
LogDebug("Invalid Class [{}] in CalcMaxMana", GetCasterClass());
|
auto base_data = zone->GetBaseData(GetLevel(), GetClass());
|
||||||
max_m = 0;
|
if (base_data.level == GetLevel()) {
|
||||||
break;
|
max_m = base_data.mana + (ConvertedWisInt * base_data.mana_fac) + itembonuses.heroic_max_mana;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (((WisInt - 199) / 2) > 0) {
|
||||||
|
MindLesserFactor = (WisInt - 199) / 2;
|
||||||
|
} else {
|
||||||
|
MindLesserFactor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MindFactor = WisInt - MindLesserFactor;
|
||||||
|
|
||||||
|
if (WisInt > 100) {
|
||||||
|
max_m = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40);
|
||||||
|
} else {
|
||||||
|
max_m = (((5 * (MindFactor + 200)) / 2) * 3 * GetLevel() / 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
max_m = 0;
|
||||||
}
|
}
|
||||||
#if EQDEBUG >= 11
|
|
||||||
LogDebug("Client::CalcBaseMana() called for [{}] - returning [{}]", GetName(), max_m);
|
|
||||||
#endif
|
|
||||||
return max_m;
|
return max_m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -19,9 +19,11 @@
|
|||||||
#define HEAD_POSITION 0.9f //ratio of GetSize() where NPCs see from
|
#define HEAD_POSITION 0.9f //ratio of GetSize() where NPCs see from
|
||||||
#define SEE_POSITION 0.5f //ratio of GetSize() where NPCs try to see for LOS
|
#define SEE_POSITION 0.5f //ratio of GetSize() where NPCs try to see for LOS
|
||||||
|
|
||||||
#define ARCHETYPE_HYBRID 1
|
namespace Archetype {
|
||||||
#define ARCHETYPE_CASTER 2
|
constexpr uint8 Hybrid = 1;
|
||||||
#define ARCHETYPE_MELEE 3
|
constexpr uint8 Caster = 2;
|
||||||
|
constexpr uint8 Melee = 3;
|
||||||
|
};
|
||||||
|
|
||||||
#define CON_GREEN 2
|
#define CON_GREEN 2
|
||||||
#define CON_LIGHTBLUE 18
|
#define CON_LIGHTBLUE 18
|
||||||
|
|||||||
@ -3333,6 +3333,30 @@ void Lua_Mob::RestoreMana()
|
|||||||
self->RestoreMana();
|
self->RestoreMana();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Lua_Mob::GetArchetypeName()
|
||||||
|
{
|
||||||
|
Lua_Safe_Call_String();
|
||||||
|
return self->GetArchetypeName();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Lua_Mob::IsIntelligenceCasterClass()
|
||||||
|
{
|
||||||
|
Lua_Safe_Call_Bool();
|
||||||
|
return self->IsIntelligenceCasterClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Lua_Mob::IsPureMeleeClass()
|
||||||
|
{
|
||||||
|
Lua_Safe_Call_Bool();
|
||||||
|
return self->IsPureMeleeClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Lua_Mob::IsWisdomCasterClass()
|
||||||
|
{
|
||||||
|
Lua_Safe_Call_Bool();
|
||||||
|
return self->IsWisdomCasterClass();
|
||||||
|
}
|
||||||
|
|
||||||
luabind::scope lua_register_mob() {
|
luabind::scope lua_register_mob() {
|
||||||
return luabind::class_<Lua_Mob, Lua_Entity>("Mob")
|
return luabind::class_<Lua_Mob, Lua_Entity>("Mob")
|
||||||
.def(luabind::constructor<>())
|
.def(luabind::constructor<>())
|
||||||
@ -3524,6 +3548,7 @@ luabind::scope lua_register_mob() {
|
|||||||
.def("GetAggroRange", (float(Lua_Mob::*)(void))&Lua_Mob::GetAggroRange)
|
.def("GetAggroRange", (float(Lua_Mob::*)(void))&Lua_Mob::GetAggroRange)
|
||||||
.def("GetAllowBeneficial", (bool(Lua_Mob::*)(void))&Lua_Mob::GetAllowBeneficial)
|
.def("GetAllowBeneficial", (bool(Lua_Mob::*)(void))&Lua_Mob::GetAllowBeneficial)
|
||||||
.def("GetAppearance", (uint32(Lua_Mob::*)(void))&Lua_Mob::GetAppearance)
|
.def("GetAppearance", (uint32(Lua_Mob::*)(void))&Lua_Mob::GetAppearance)
|
||||||
|
.def("GetArchetypeName", &Lua_Mob::GetArchetypeName)
|
||||||
.def("GetAssistRange", (float(Lua_Mob::*)(void))&Lua_Mob::GetAssistRange)
|
.def("GetAssistRange", (float(Lua_Mob::*)(void))&Lua_Mob::GetAssistRange)
|
||||||
.def("GetBaseGender", &Lua_Mob::GetBaseGender)
|
.def("GetBaseGender", &Lua_Mob::GetBaseGender)
|
||||||
.def("GetBaseRace", &Lua_Mob::GetBaseRace)
|
.def("GetBaseRace", &Lua_Mob::GetBaseRace)
|
||||||
@ -3732,6 +3757,7 @@ luabind::scope lua_register_mob() {
|
|||||||
.def("IsFindable", (bool(Lua_Mob::*)(void))&Lua_Mob::IsFindable)
|
.def("IsFindable", (bool(Lua_Mob::*)(void))&Lua_Mob::IsFindable)
|
||||||
.def("IsHorse", &Lua_Mob::IsHorse)
|
.def("IsHorse", &Lua_Mob::IsHorse)
|
||||||
.def("IsImmuneToSpell", (bool(Lua_Mob::*)(int,Lua_Mob))&Lua_Mob::IsImmuneToSpell)
|
.def("IsImmuneToSpell", (bool(Lua_Mob::*)(int,Lua_Mob))&Lua_Mob::IsImmuneToSpell)
|
||||||
|
.def("IsIntelligenceCasterClass", &Lua_Mob::IsIntelligenceCasterClass)
|
||||||
.def("IsInvisible", (bool(Lua_Mob::*)(Lua_Mob))&Lua_Mob::IsInvisible)
|
.def("IsInvisible", (bool(Lua_Mob::*)(Lua_Mob))&Lua_Mob::IsInvisible)
|
||||||
.def("IsInvisible", (bool(Lua_Mob::*)(void))&Lua_Mob::IsInvisible)
|
.def("IsInvisible", (bool(Lua_Mob::*)(void))&Lua_Mob::IsInvisible)
|
||||||
.def("IsMeleeDisabled", (bool(Lua_Mob::*)(void))&Lua_Mob::IsMeleeDisabled)
|
.def("IsMeleeDisabled", (bool(Lua_Mob::*)(void))&Lua_Mob::IsMeleeDisabled)
|
||||||
@ -3742,6 +3768,7 @@ luabind::scope lua_register_mob() {
|
|||||||
.def("IsPetOwnerBot", &Lua_Mob::IsPetOwnerBot)
|
.def("IsPetOwnerBot", &Lua_Mob::IsPetOwnerBot)
|
||||||
.def("IsPetOwnerClient", &Lua_Mob::IsPetOwnerClient)
|
.def("IsPetOwnerClient", &Lua_Mob::IsPetOwnerClient)
|
||||||
.def("IsPetOwnerNPC", &Lua_Mob::IsPetOwnerNPC)
|
.def("IsPetOwnerNPC", &Lua_Mob::IsPetOwnerNPC)
|
||||||
|
.def("IsPureMeleeClass", &Lua_Mob::IsPureMeleeClass)
|
||||||
.def("IsRoamer", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRoamer)
|
.def("IsRoamer", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRoamer)
|
||||||
.def("IsRooted", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRooted)
|
.def("IsRooted", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRooted)
|
||||||
.def("IsRunning", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRunning)
|
.def("IsRunning", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRunning)
|
||||||
@ -3753,6 +3780,7 @@ luabind::scope lua_register_mob() {
|
|||||||
.def("IsTemporaryPet", &Lua_Mob::IsTemporaryPet)
|
.def("IsTemporaryPet", &Lua_Mob::IsTemporaryPet)
|
||||||
.def("IsTrackable", (bool(Lua_Mob::*)(void))&Lua_Mob::IsTrackable)
|
.def("IsTrackable", (bool(Lua_Mob::*)(void))&Lua_Mob::IsTrackable)
|
||||||
.def("IsWarriorClass", &Lua_Mob::IsWarriorClass)
|
.def("IsWarriorClass", &Lua_Mob::IsWarriorClass)
|
||||||
|
.def("IsWisdomCasterClass", &Lua_Mob::IsWisdomCasterClass)
|
||||||
.def("Kill", (void(Lua_Mob::*)(void))&Lua_Mob::Kill)
|
.def("Kill", (void(Lua_Mob::*)(void))&Lua_Mob::Kill)
|
||||||
.def("Mesmerize", (void(Lua_Mob::*)(void))&Lua_Mob::Mesmerize)
|
.def("Mesmerize", (void(Lua_Mob::*)(void))&Lua_Mob::Mesmerize)
|
||||||
.def("Message", &Lua_Mob::Message)
|
.def("Message", &Lua_Mob::Message)
|
||||||
|
|||||||
@ -586,6 +586,10 @@ public:
|
|||||||
void RestoreEndurance();
|
void RestoreEndurance();
|
||||||
void RestoreHealth();
|
void RestoreHealth();
|
||||||
void RestoreMana();
|
void RestoreMana();
|
||||||
|
std::string GetArchetypeName();
|
||||||
|
bool IsIntelligenceCasterClass();
|
||||||
|
bool IsPureMeleeClass();
|
||||||
|
bool IsWisdomCasterClass();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -489,23 +489,12 @@ int64 Merc::CalcBaseHP()
|
|||||||
|
|
||||||
int64 Merc::CalcMaxMana()
|
int64 Merc::CalcMaxMana()
|
||||||
{
|
{
|
||||||
switch(GetCasterClass())
|
if (IsIntelligenceCasterClass() || IsWisdomCasterClass()) {
|
||||||
{
|
|
||||||
case 'I':
|
|
||||||
case 'W': {
|
|
||||||
max_mana = (CalcBaseMana() + itembonuses.Mana + spellbonuses.Mana + GroupLeadershipAAManaEnhancement());
|
max_mana = (CalcBaseMana() + itembonuses.Mana + spellbonuses.Mana + GroupLeadershipAAManaEnhancement());
|
||||||
break;
|
} else {
|
||||||
}
|
|
||||||
case 'N': {
|
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
LogDebug("Invalid Class [{}] in CalcMaxMana", GetCasterClass());
|
|
||||||
max_mana = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_mana < 0) {
|
if (max_mana < 0) {
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
}
|
}
|
||||||
@ -565,12 +554,13 @@ int64 Merc::CalcManaRegen()
|
|||||||
regen = mana_regen + spellbonuses.ManaRegen + itembonuses.ManaRegen;
|
regen = mana_regen + spellbonuses.ManaRegen + itembonuses.ManaRegen;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GetCasterClass() == 'I')
|
if (IsIntelligenceCasterClass()) {
|
||||||
regen += (itembonuses.HeroicINT / 25);
|
regen += (itembonuses.HeroicINT / 25);
|
||||||
else if(GetCasterClass() == 'W')
|
} else if (IsWisdomCasterClass()) {
|
||||||
regen += (itembonuses.HeroicWIS / 25);
|
regen += (itembonuses.HeroicWIS / 25);
|
||||||
else
|
} else {
|
||||||
regen = 0;
|
regen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
//AAs
|
//AAs
|
||||||
regen += aabonuses.ManaRegen;
|
regen += aabonuses.ManaRegen;
|
||||||
@ -581,14 +571,11 @@ int64 Merc::CalcManaRegen()
|
|||||||
int64 Merc::CalcManaRegenCap()
|
int64 Merc::CalcManaRegenCap()
|
||||||
{
|
{
|
||||||
int64 cap = RuleI(Character, ItemManaRegenCap) + aabonuses.ItemManaRegenCap;
|
int64 cap = RuleI(Character, ItemManaRegenCap) + aabonuses.ItemManaRegenCap;
|
||||||
switch(GetCasterClass())
|
|
||||||
{
|
if (IsIntelligenceCasterClass()) {
|
||||||
case 'I':
|
|
||||||
cap += (itembonuses.HeroicINT / 25);
|
cap += (itembonuses.HeroicINT / 25);
|
||||||
break;
|
} else if (IsWisdomCasterClass()) {
|
||||||
case 'W':
|
|
||||||
cap += (itembonuses.HeroicWIS / 25);
|
cap += (itembonuses.HeroicWIS / 25);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (cap * RuleI(Character, ManaRegenMultiplier) / 100);
|
return (cap * RuleI(Character, ManaRegenMultiplier) / 100);
|
||||||
@ -1166,7 +1153,7 @@ void Merc::AI_Process() {
|
|||||||
float newX = 0;
|
float newX = 0;
|
||||||
float newY = 0;
|
float newY = 0;
|
||||||
float newZ = 0;
|
float newZ = 0;
|
||||||
if (PlotPositionAroundTarget(GetTarget(), newX, newY, newZ, false) && GetArchetype() != ARCHETYPE_CASTER) {
|
if (PlotPositionAroundTarget(GetTarget(), newX, newY, newZ, false) && GetArchetype() != Archetype::Caster) {
|
||||||
RunTo(newX, newY, newZ);
|
RunTo(newX, newY, newZ);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1314,7 +1301,7 @@ void Merc::AI_Process() {
|
|||||||
if(AI_EngagedCastCheck()) {
|
if(AI_EngagedCastCheck()) {
|
||||||
MercMeditate(false);
|
MercMeditate(false);
|
||||||
}
|
}
|
||||||
else if(GetArchetype() == ARCHETYPE_CASTER)
|
else if(GetArchetype() == Archetype::Caster)
|
||||||
MercMeditate(true);
|
MercMeditate(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1337,7 +1324,7 @@ void Merc::AI_Process() {
|
|||||||
//TODO: Implement passive stances.
|
//TODO: Implement passive stances.
|
||||||
//if(GetStance() != MercStancePassive) {
|
//if(GetStance() != MercStancePassive) {
|
||||||
if(!AI_IdleCastCheck() && !IsCasting()) {
|
if(!AI_IdleCastCheck() && !IsCasting()) {
|
||||||
if(GetArchetype() == ARCHETYPE_CASTER) {
|
if(GetArchetype() == Archetype::Caster) {
|
||||||
MercMeditate(true);
|
MercMeditate(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1792,7 +1779,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
|||||||
if( !IsImmuneToSpell(selectedMercSpell.spellid, this)
|
if( !IsImmuneToSpell(selectedMercSpell.spellid, this)
|
||||||
&& (CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
&& (CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
||||||
|
|
||||||
if( GetArchetype() == ARCHETYPE_MELEE && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
if( GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1819,7 +1806,7 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
|||||||
if( !tar->IsImmuneToSpell(selectedMercSpell.spellid, this)
|
if( !tar->IsImmuneToSpell(selectedMercSpell.spellid, this)
|
||||||
&& (tar->CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
&& (tar->CanBuffStack(selectedMercSpell.spellid, mercLevel, true) >= 0)) {
|
||||||
|
|
||||||
if( tar->GetArchetype() == ARCHETYPE_MELEE && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
if( tar->GetArchetype() == Archetype::Melee && IsEffectInSpell(selectedMercSpell.spellid, SE_IncreaseSpellHaste)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
279
zone/mob.cpp
279
zone/mob.cpp
@ -940,19 +940,16 @@ int Mob::_GetFearSpeed() const {
|
|||||||
return speed_mod;
|
return speed_mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 Mob::CalcMaxMana() {
|
int64 Mob::CalcMaxMana()
|
||||||
switch (GetCasterClass()) {
|
{
|
||||||
case 'I':
|
if (IsIntelligenceCasterClass()) {
|
||||||
max_mana = (((GetINT()/2)+1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
max_mana = (((GetINT() / 2) + 1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
||||||
break;
|
} else if (IsWisdomCasterClass()) {
|
||||||
case 'W':
|
max_mana = (((GetWIS() / 2) + 1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
||||||
max_mana = (((GetWIS()/2)+1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
} else {
|
||||||
break;
|
max_mana = 0;
|
||||||
case 'N':
|
|
||||||
default:
|
|
||||||
max_mana = 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_mana < 0) {
|
if (max_mana < 0) {
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
}
|
}
|
||||||
@ -981,90 +978,155 @@ int64 Mob::GetSpellHPBonuses() {
|
|||||||
return spell_hp;
|
return spell_hp;
|
||||||
}
|
}
|
||||||
|
|
||||||
char Mob::GetCasterClass() const {
|
bool Mob::IsIntelligenceCasterClass() const
|
||||||
switch(class_)
|
{
|
||||||
{
|
switch (GetClass()) {
|
||||||
case Class::Cleric:
|
case Class::ShadowKnight:
|
||||||
case Class::Paladin:
|
case Class::Bard:
|
||||||
case Class::Ranger:
|
case Class::Necromancer:
|
||||||
case Class::Druid:
|
case Class::Wizard:
|
||||||
case Class::Shaman:
|
case Class::Magician:
|
||||||
case Class::Beastlord:
|
case Class::Enchanter:
|
||||||
case Class::ClericGM:
|
case Class::ShadowKnightGM:
|
||||||
case Class::PaladinGM:
|
case Class::BardGM:
|
||||||
case Class::RangerGM:
|
case Class::NecromancerGM:
|
||||||
case Class::DruidGM:
|
case Class::WizardGM:
|
||||||
case Class::ShamanGM:
|
case Class::MagicianGM:
|
||||||
case Class::BeastlordGM:
|
case Class::EnchanterGM:
|
||||||
return 'W';
|
return true;
|
||||||
break;
|
|
||||||
|
|
||||||
case Class::ShadowKnight:
|
|
||||||
case Class::Bard:
|
|
||||||
case Class::Necromancer:
|
|
||||||
case Class::Wizard:
|
|
||||||
case Class::Magician:
|
|
||||||
case Class::Enchanter:
|
|
||||||
case Class::ShadowKnightGM:
|
|
||||||
case Class::BardGM:
|
|
||||||
case Class::NecromancerGM:
|
|
||||||
case Class::WizardGM:
|
|
||||||
case Class::MagicianGM:
|
|
||||||
case Class::EnchanterGM:
|
|
||||||
return 'I';
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return 'N';
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 Mob::GetArchetype() const {
|
bool Mob::IsPureMeleeClass() const
|
||||||
switch(class_)
|
{
|
||||||
{
|
switch (GetClass()) {
|
||||||
case Class::Paladin:
|
case Class::Warrior:
|
||||||
case Class::Ranger:
|
case Class::Monk:
|
||||||
case Class::ShadowKnight:
|
case Class::Rogue:
|
||||||
case Class::Bard:
|
case Class::Berserker:
|
||||||
case Class::Beastlord:
|
case Class::WarriorGM:
|
||||||
case Class::PaladinGM:
|
case Class::MonkGM:
|
||||||
case Class::RangerGM:
|
case Class::RogueGM:
|
||||||
case Class::ShadowKnightGM:
|
case Class::BerserkerGM:
|
||||||
case Class::BardGM:
|
return true;
|
||||||
case Class::BeastlordGM:
|
default:
|
||||||
return ARCHETYPE_HYBRID;
|
break;
|
||||||
break;
|
|
||||||
case Class::Cleric:
|
|
||||||
case Class::Druid:
|
|
||||||
case Class::Shaman:
|
|
||||||
case Class::Necromancer:
|
|
||||||
case Class::Wizard:
|
|
||||||
case Class::Magician:
|
|
||||||
case Class::Enchanter:
|
|
||||||
case Class::ClericGM:
|
|
||||||
case Class::DruidGM:
|
|
||||||
case Class::ShamanGM:
|
|
||||||
case Class::NecromancerGM:
|
|
||||||
case Class::WizardGM:
|
|
||||||
case Class::MagicianGM:
|
|
||||||
case Class::EnchanterGM:
|
|
||||||
return ARCHETYPE_CASTER;
|
|
||||||
break;
|
|
||||||
case Class::Warrior:
|
|
||||||
case Class::Monk:
|
|
||||||
case Class::Rogue:
|
|
||||||
case Class::Berserker:
|
|
||||||
case Class::WarriorGM:
|
|
||||||
case Class::MonkGM:
|
|
||||||
case Class::RogueGM:
|
|
||||||
case Class::BerserkerGM:
|
|
||||||
return ARCHETYPE_MELEE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return ARCHETYPE_HYBRID;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Mob::IsWarriorClass() const
|
||||||
|
{
|
||||||
|
switch (GetClass()) {
|
||||||
|
case Class::Warrior:
|
||||||
|
case Class::Paladin:
|
||||||
|
case Class::Ranger:
|
||||||
|
case Class::ShadowKnight:
|
||||||
|
case Class::Monk:
|
||||||
|
case Class::Bard:
|
||||||
|
case Class::Rogue:
|
||||||
|
case Class::Beastlord:
|
||||||
|
case Class::Berserker:
|
||||||
|
case Class::WarriorGM:
|
||||||
|
case Class::PaladinGM:
|
||||||
|
case Class::RangerGM:
|
||||||
|
case Class::ShadowKnightGM:
|
||||||
|
case Class::MonkGM:
|
||||||
|
case Class::BardGM:
|
||||||
|
case Class::RogueGM:
|
||||||
|
case Class::BeastlordGM:
|
||||||
|
case Class::BerserkerGM:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Mob::IsWisdomCasterClass() const
|
||||||
|
{
|
||||||
|
switch (GetClass()) {
|
||||||
|
case Class::Cleric:
|
||||||
|
case Class::Paladin:
|
||||||
|
case Class::Ranger:
|
||||||
|
case Class::Druid:
|
||||||
|
case Class::Shaman:
|
||||||
|
case Class::Beastlord:
|
||||||
|
case Class::ClericGM:
|
||||||
|
case Class::PaladinGM:
|
||||||
|
case Class::RangerGM:
|
||||||
|
case Class::DruidGM:
|
||||||
|
case Class::ShamanGM:
|
||||||
|
case Class::BeastlordGM:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 Mob::GetArchetype() const
|
||||||
|
{
|
||||||
|
switch (GetClass()) {
|
||||||
|
case Class::Paladin:
|
||||||
|
case Class::Ranger:
|
||||||
|
case Class::ShadowKnight:
|
||||||
|
case Class::Bard:
|
||||||
|
case Class::Beastlord:
|
||||||
|
case Class::PaladinGM:
|
||||||
|
case Class::RangerGM:
|
||||||
|
case Class::ShadowKnightGM:
|
||||||
|
case Class::BardGM:
|
||||||
|
case Class::BeastlordGM:
|
||||||
|
return Archetype::Hybrid;
|
||||||
|
case Class::Cleric:
|
||||||
|
case Class::Druid:
|
||||||
|
case Class::Shaman:
|
||||||
|
case Class::Necromancer:
|
||||||
|
case Class::Wizard:
|
||||||
|
case Class::Magician:
|
||||||
|
case Class::Enchanter:
|
||||||
|
case Class::ClericGM:
|
||||||
|
case Class::DruidGM:
|
||||||
|
case Class::ShamanGM:
|
||||||
|
case Class::NecromancerGM:
|
||||||
|
case Class::WizardGM:
|
||||||
|
case Class::MagicianGM:
|
||||||
|
case Class::EnchanterGM:
|
||||||
|
return Archetype::Caster;
|
||||||
|
case Class::Warrior:
|
||||||
|
case Class::Monk:
|
||||||
|
case Class::Rogue:
|
||||||
|
case Class::Berserker:
|
||||||
|
case Class::WarriorGM:
|
||||||
|
case Class::MonkGM:
|
||||||
|
case Class::RogueGM:
|
||||||
|
case Class::BerserkerGM:
|
||||||
|
return Archetype::Melee;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Archetype::Hybrid;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& Mob::GetArchetypeName()
|
||||||
|
{
|
||||||
|
switch (GetArchetype()) {
|
||||||
|
case Archetype::Hybrid:
|
||||||
|
return "Hybrid";
|
||||||
|
case Archetype::Caster:
|
||||||
|
return "Caster";
|
||||||
|
case Archetype::Melee:
|
||||||
|
return "Melee";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Hybrid";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mob::SetSpawnLastNameByClass(NewSpawn_Struct* ns)
|
void Mob::SetSpawnLastNameByClass(NewSpawn_Struct* ns)
|
||||||
@ -4586,39 +4648,6 @@ bool Mob::CanThisClassTripleAttack() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Mob::IsWarriorClass(void) const
|
|
||||||
{
|
|
||||||
switch(GetClass())
|
|
||||||
{
|
|
||||||
case Class::Warrior:
|
|
||||||
case Class::WarriorGM:
|
|
||||||
case Class::Rogue:
|
|
||||||
case Class::RogueGM:
|
|
||||||
case Class::Monk:
|
|
||||||
case Class::MonkGM:
|
|
||||||
case Class::Paladin:
|
|
||||||
case Class::PaladinGM:
|
|
||||||
case Class::ShadowKnight:
|
|
||||||
case Class::ShadowKnightGM:
|
|
||||||
case Class::Ranger:
|
|
||||||
case Class::RangerGM:
|
|
||||||
case Class::Beastlord:
|
|
||||||
case Class::BeastlordGM:
|
|
||||||
case Class::Berserker:
|
|
||||||
case Class::BerserkerGM:
|
|
||||||
case Class::Bard:
|
|
||||||
case Class::BardGM:
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Mob::CanThisClassParry(void) const
|
bool Mob::CanThisClassParry(void) const
|
||||||
{
|
{
|
||||||
if(!IsClient()) {
|
if(!IsClient()) {
|
||||||
|
|||||||
@ -838,8 +838,11 @@ public:
|
|||||||
virtual void MakePet(uint16 spell_id, const char* pettype, const char *petname = nullptr);
|
virtual void MakePet(uint16 spell_id, const char* pettype, const char *petname = nullptr);
|
||||||
virtual void MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, const char *petname = nullptr, float in_size = 0.0f);
|
virtual void MakePoweredPet(uint16 spell_id, const char* pettype, int16 petpower, const char *petname = nullptr, float in_size = 0.0f);
|
||||||
bool IsWarriorClass() const;
|
bool IsWarriorClass() const;
|
||||||
char GetCasterClass() const;
|
bool IsIntelligenceCasterClass() const;
|
||||||
|
bool IsPureMeleeClass() const;
|
||||||
|
bool IsWisdomCasterClass() const;
|
||||||
uint8 GetArchetype() const;
|
uint8 GetArchetype() const;
|
||||||
|
const std::string& GetArchetypeName();
|
||||||
void SetZone(uint32 zone_id, uint32 instance_id);
|
void SetZone(uint32 zone_id, uint32 instance_id);
|
||||||
void SendStatsWindow(Client* c, bool use_window);
|
void SendStatsWindow(Client* c, bool use_window);
|
||||||
void ShowStats(Client* client);
|
void ShowStats(Client* client);
|
||||||
|
|||||||
37
zone/npc.cpp
37
zone/npc.cpp
@ -2756,35 +2756,28 @@ void NPC::SetSwarmTarget(int target_id)
|
|||||||
int64 NPC::CalcMaxMana()
|
int64 NPC::CalcMaxMana()
|
||||||
{
|
{
|
||||||
if (npc_mana == 0) {
|
if (npc_mana == 0) {
|
||||||
switch (GetCasterClass()) {
|
if (IsIntelligenceCasterClass()) {
|
||||||
case 'I':
|
max_mana = (((GetINT() / 2) + 1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
||||||
max_mana = (((GetINT() / 2) + 1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
} else if (IsWisdomCasterClass()) {
|
||||||
break;
|
max_mana = (((GetWIS() / 2) + 1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
||||||
case 'W':
|
} else {
|
||||||
max_mana = (((GetWIS() / 2) + 1) * GetLevel()) + spellbonuses.Mana + itembonuses.Mana;
|
max_mana = 0;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
max_mana = 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_mana < 0) {
|
if (max_mana < 0) {
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return max_mana;
|
return max_mana;
|
||||||
}
|
} else {
|
||||||
else {
|
if (IsIntelligenceCasterClass()) {
|
||||||
switch (GetCasterClass()) {
|
max_mana = npc_mana + spellbonuses.Mana + itembonuses.Mana;
|
||||||
case 'I':
|
} else if (IsWisdomCasterClass()) {
|
||||||
max_mana = npc_mana + spellbonuses.Mana + itembonuses.Mana;
|
max_mana = npc_mana + spellbonuses.Mana + itembonuses.Mana;
|
||||||
break;
|
} else {
|
||||||
case 'W':
|
max_mana = 0;
|
||||||
max_mana = npc_mana + spellbonuses.Mana + itembonuses.Mana;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
max_mana = 0;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_mana < 0) {
|
if (max_mana < 0) {
|
||||||
max_mana = 0;
|
max_mana = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3448,6 +3448,26 @@ void Perl_Mob_RestoreMana(Mob* self)
|
|||||||
self->RestoreMana();
|
self->RestoreMana();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Perl_Mob_GetArchetypeName(Mob* self)
|
||||||
|
{
|
||||||
|
return self->GetArchetypeName();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Perl_Mob_IsIntelligenceCasterClass(Mob* self)
|
||||||
|
{
|
||||||
|
return self->IsIntelligenceCasterClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Perl_Mob_IsPureMeleeClass(Mob* self)
|
||||||
|
{
|
||||||
|
return self->IsPureMeleeClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Perl_Mob_IsWisdomCasterClass(Mob* self)
|
||||||
|
{
|
||||||
|
return self->IsWisdomCasterClass();
|
||||||
|
}
|
||||||
|
|
||||||
void perl_register_mob()
|
void perl_register_mob()
|
||||||
{
|
{
|
||||||
perl::interpreter perl(PERL_GET_THX);
|
perl::interpreter perl(PERL_GET_THX);
|
||||||
@ -3620,6 +3640,7 @@ void perl_register_mob()
|
|||||||
package.add("GetAggroRange", &Perl_Mob_GetAggroRange);
|
package.add("GetAggroRange", &Perl_Mob_GetAggroRange);
|
||||||
package.add("GetAllowBeneficial", &Perl_Mob_GetAllowBeneficial);
|
package.add("GetAllowBeneficial", &Perl_Mob_GetAllowBeneficial);
|
||||||
package.add("GetAppearance", &Perl_Mob_GetAppearance);
|
package.add("GetAppearance", &Perl_Mob_GetAppearance);
|
||||||
|
package.add("GetArchetypeName", &Perl_Mob_GetArchetypeName);
|
||||||
package.add("GetArmorTint", &Perl_Mob_GetArmorTint);
|
package.add("GetArmorTint", &Perl_Mob_GetArmorTint);
|
||||||
package.add("GetAssistRange", &Perl_Mob_GetAssistRange);
|
package.add("GetAssistRange", &Perl_Mob_GetAssistRange);
|
||||||
package.add("GetBaseGender", &Perl_Mob_GetBaseGender);
|
package.add("GetBaseGender", &Perl_Mob_GetBaseGender);
|
||||||
@ -3843,6 +3864,7 @@ void perl_register_mob()
|
|||||||
package.add("IsFindable", &Perl_Mob_IsFindable);
|
package.add("IsFindable", &Perl_Mob_IsFindable);
|
||||||
package.add("IsHorse", &Perl_Mob_IsHorse);
|
package.add("IsHorse", &Perl_Mob_IsHorse);
|
||||||
package.add("IsImmuneToSpell", &Perl_Mob_IsImmuneToSpell);
|
package.add("IsImmuneToSpell", &Perl_Mob_IsImmuneToSpell);
|
||||||
|
package.add("IsIntelligenceCasterClass", &Perl_Mob_IsIntelligenceCasterClass);
|
||||||
package.add("IsInvisible", (bool(*)(Mob*))&Perl_Mob_IsInvisible);
|
package.add("IsInvisible", (bool(*)(Mob*))&Perl_Mob_IsInvisible);
|
||||||
package.add("IsInvisible", (bool(*)(Mob*, Mob*))&Perl_Mob_IsInvisible);
|
package.add("IsInvisible", (bool(*)(Mob*, Mob*))&Perl_Mob_IsInvisible);
|
||||||
package.add("IsMeleeDisabled", &Perl_Mob_IsMeleeDisabled);
|
package.add("IsMeleeDisabled", &Perl_Mob_IsMeleeDisabled);
|
||||||
@ -3861,6 +3883,7 @@ void perl_register_mob()
|
|||||||
package.add("IsPetOwnerClient", &Perl_Mob_IsPetOwnerClient);
|
package.add("IsPetOwnerClient", &Perl_Mob_IsPetOwnerClient);
|
||||||
package.add("IsPetOwnerNPC", &Perl_Mob_IsPetOwnerNPC);
|
package.add("IsPetOwnerNPC", &Perl_Mob_IsPetOwnerNPC);
|
||||||
package.add("IsPlayerCorpse", &Perl_Mob_IsPlayerCorpse);
|
package.add("IsPlayerCorpse", &Perl_Mob_IsPlayerCorpse);
|
||||||
|
package.add("IsPureMeleeClass", &Perl_Mob_IsPureMeleeClass);
|
||||||
package.add("IsRoamer", &Perl_Mob_IsRoamer);
|
package.add("IsRoamer", &Perl_Mob_IsRoamer);
|
||||||
package.add("IsRooted", &Perl_Mob_IsRooted);
|
package.add("IsRooted", &Perl_Mob_IsRooted);
|
||||||
package.add("IsRunning", &Perl_Mob_IsRunning);
|
package.add("IsRunning", &Perl_Mob_IsRunning);
|
||||||
@ -3873,6 +3896,7 @@ void perl_register_mob()
|
|||||||
package.add("IsTrackable", &Perl_Mob_IsTrackable);
|
package.add("IsTrackable", &Perl_Mob_IsTrackable);
|
||||||
package.add("IsTrap", &Perl_Mob_IsTrap);
|
package.add("IsTrap", &Perl_Mob_IsTrap);
|
||||||
package.add("IsWarriorClass", &Perl_Mob_IsWarriorClass);
|
package.add("IsWarriorClass", &Perl_Mob_IsWarriorClass);
|
||||||
|
package.add("IsWisdomCasterClass", &Perl_Mob_IsWisdomCasterClass);
|
||||||
package.add("Kill", &Perl_Mob_Kill);
|
package.add("Kill", &Perl_Mob_Kill);
|
||||||
package.add("MakePet", (void(*)(Mob*, uint16, const char*))&Perl_Mob_MakePet);
|
package.add("MakePet", (void(*)(Mob*, uint16, const char*))&Perl_Mob_MakePet);
|
||||||
package.add("MakePet", (void(*)(Mob*, uint16, const char*, const char*))&Perl_Mob_MakePet);
|
package.add("MakePet", (void(*)(Mob*, uint16, const char*, const char*))&Perl_Mob_MakePet);
|
||||||
|
|||||||
@ -456,7 +456,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
|||||||
if(GetClass() == Class::Bard)
|
if(GetClass() == Class::Bard)
|
||||||
break;
|
break;
|
||||||
if(IsManaTapSpell(spell_id)) {
|
if(IsManaTapSpell(spell_id)) {
|
||||||
if(GetCasterClass() != 'N') {
|
if (!IsPureMeleeClass()) {
|
||||||
#ifdef SPELL_EFFECT_SPAM
|
#ifdef SPELL_EFFECT_SPAM
|
||||||
snprintf(effect_desc, _EDLEN, "Current Mana: %+i", effect_value);
|
snprintf(effect_desc, _EDLEN, "Current Mana: %+i", effect_value);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -224,8 +224,12 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, CastingSlot slot,
|
|||||||
if(GetTarget() && IsManaTapSpell(spell_id)) {
|
if(GetTarget() && IsManaTapSpell(spell_id)) {
|
||||||
// If melee, block if ManaTapsOnAnyClass rule is false
|
// If melee, block if ManaTapsOnAnyClass rule is false
|
||||||
// if caster, block if ManaTapsRequireNPCMana and no mana
|
// if caster, block if ManaTapsRequireNPCMana and no mana
|
||||||
bool melee_block = !RuleB(Spells, ManaTapsOnAnyClass);
|
bool melee_block = !RuleB(Spells, ManaTapsOnAnyClass);
|
||||||
bool caster_block = (GetTarget()->GetCasterClass() != 'N' && RuleB(Spells, ManaTapsRequireNPCMana) && GetTarget()->GetMana() == 0);
|
bool caster_block = (
|
||||||
|
!GetTarget()->IsPureMeleeClass() &&
|
||||||
|
RuleB(Spells, ManaTapsRequireNPCMana) &&
|
||||||
|
GetTarget()->GetMana() == 0
|
||||||
|
);
|
||||||
if (melee_block || caster_block) {
|
if (melee_block || caster_block) {
|
||||||
InterruptSpell(TARGET_NO_MANA, 0x121, spell_id);
|
InterruptSpell(TARGET_NO_MANA, 0x121, spell_id);
|
||||||
return false;
|
return false;
|
||||||
@ -1105,10 +1109,10 @@ bool Client::CheckFizzle(uint16 spell_id)
|
|||||||
// CALCULATE EFFECTIVE CASTING STAT VALUE
|
// CALCULATE EFFECTIVE CASTING STAT VALUE
|
||||||
float prime_stat_reduction = 0.0f;
|
float prime_stat_reduction = 0.0f;
|
||||||
|
|
||||||
if (GetCasterClass() == 'W') {
|
if (IsIntelligenceCasterClass()) {
|
||||||
prime_stat_reduction = (GetWIS() - 75) / 10.0;
|
|
||||||
} else if (GetCasterClass() == 'I') {
|
|
||||||
prime_stat_reduction = (GetINT() - 75) / 10.0;
|
prime_stat_reduction = (GetINT() - 75) / 10.0;
|
||||||
|
} else if (IsWisdomCasterClass()) {
|
||||||
|
prime_stat_reduction = (GetWIS() - 75) / 10.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// BARDS ARE SPECIAL - they add both CHA and DEX mods to get casting rates similar to full casters without spec skill
|
// BARDS ARE SPECIAL - they add both CHA and DEX mods to get casting rates similar to full casters without spec skill
|
||||||
@ -1183,10 +1187,10 @@ bool Client::CheckFizzle(uint16 spell_id)
|
|||||||
// if you have high int/wis you fizzle less, you fizzle more if you are stupid
|
// if you have high int/wis you fizzle less, you fizzle more if you are stupid
|
||||||
if (GetClass() == Class::Bard) {
|
if (GetClass() == Class::Bard) {
|
||||||
diff -= (GetCHA() - 110) / 20.0;
|
diff -= (GetCHA() - 110) / 20.0;
|
||||||
} else if (GetCasterClass() == 'W') {
|
} else if (IsIntelligenceCasterClass()) {
|
||||||
diff -= (GetWIS() - 125) / 20.0;
|
|
||||||
} else if (GetCasterClass() == 'I') {
|
|
||||||
diff -= (GetINT() - 125) / 20.0;
|
diff -= (GetINT() - 125) / 20.0;
|
||||||
|
} else if (IsWisdomCasterClass()) {
|
||||||
|
diff -= (GetWIS() - 125) / 20.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// base fizzlechance is lets say 5%, we can make it lower for AA skills or whatever
|
// base fizzlechance is lets say 5%, we can make it lower for AA skills or whatever
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user