mirror of
https://github.com/EQEmu/Server.git
synced 2026-04-08 18:22:26 +00:00
Merge branch 'master' of https://github.com/EQEmu/Server
This commit is contained in:
commit
9154938827
@ -220,7 +220,7 @@ namespace EQ
|
|||||||
resend_delay_ms = 150;
|
resend_delay_ms = 150;
|
||||||
resend_delay_factor = 1.5;
|
resend_delay_factor = 1.5;
|
||||||
resend_delay_min = 150;
|
resend_delay_min = 150;
|
||||||
resend_delay_max = 4000;
|
resend_delay_max = 1000;
|
||||||
connect_delay_ms = 500;
|
connect_delay_ms = 500;
|
||||||
stale_connection_ms = 90000;
|
stale_connection_ms = 90000;
|
||||||
connect_stale_ms = 5000;
|
connect_stale_ms = 5000;
|
||||||
|
|||||||
@ -397,6 +397,7 @@ RULE_BOOL(Spells, FlatItemExtraSpellAmt, false) // allow SpellDmg stat to affect
|
|||||||
RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false) // ignore the 5 level spread on applying SpellDmg
|
RULE_BOOL(Spells, IgnoreSpellDmgLvlRestriction, false) // ignore the 5 level spread on applying SpellDmg
|
||||||
RULE_BOOL(Spells, AllowItemTGB, false) // TGB doesn't work with items on live, custom servers want it though
|
RULE_BOOL(Spells, AllowItemTGB, false) // TGB doesn't work with items on live, custom servers want it though
|
||||||
RULE_BOOL(Spells, NPCInnateProcOverride, true) // NPC innate procs override the target type to single target.
|
RULE_BOOL(Spells, NPCInnateProcOverride, true) // NPC innate procs override the target type to single target.
|
||||||
|
RULE_BOOL(Spells, OldRainTargets, false) // use old incorrectly implemented max targets for rains
|
||||||
RULE_CATEGORY_END()
|
RULE_CATEGORY_END()
|
||||||
|
|
||||||
RULE_CATEGORY(Combat)
|
RULE_CATEGORY(Combat)
|
||||||
|
|||||||
@ -68,6 +68,7 @@ Beacon::Beacon(Mob *at_mob, int lifetime)
|
|||||||
resist_adjust = 0;
|
resist_adjust = 0;
|
||||||
spell_iterations = 0;
|
spell_iterations = 0;
|
||||||
caster_id = 0;
|
caster_id = 0;
|
||||||
|
max_targets = 4; // default
|
||||||
|
|
||||||
if(lifetime)
|
if(lifetime)
|
||||||
remove_timer.Start();
|
remove_timer.Start();
|
||||||
@ -93,10 +94,10 @@ bool Beacon::Process()
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
Mob *caster = entity_list.GetMob(caster_id);
|
Mob *caster = entity_list.GetMob(caster_id);
|
||||||
if(caster && spell_iterations--)
|
if(caster && spell_iterations-- && max_targets)
|
||||||
{
|
{
|
||||||
bool affect_caster = (!caster->IsNPC() && !caster->IsAIControlled()); //NPC AE spells do not affect the NPC caster
|
bool affect_caster = (!caster->IsNPC() && !caster->IsAIControlled()); //NPC AE spells do not affect the NPC caster
|
||||||
entity_list.AESpell(caster, this, spell_id, affect_caster, resist_adjust);
|
entity_list.AESpell(caster, this, spell_id, affect_caster, resist_adjust, &max_targets);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -126,6 +127,8 @@ void Beacon::AELocationSpell(Mob *caster, uint16 cast_spell_id, int16 resist_adj
|
|||||||
this->resist_adjust = resist_adjust;
|
this->resist_adjust = resist_adjust;
|
||||||
spell_iterations = spells[spell_id].AEDuration / 2500;
|
spell_iterations = spells[spell_id].AEDuration / 2500;
|
||||||
spell_iterations = spell_iterations < 1 ? 1 : spell_iterations; // at least 1
|
spell_iterations = spell_iterations < 1 ? 1 : spell_iterations; // at least 1
|
||||||
|
if (spells[spell_id].aemaxtargets)
|
||||||
|
max_targets = spells[spell_id].aemaxtargets;
|
||||||
spell_timer.Start(2500);
|
spell_timer.Start(2500);
|
||||||
spell_timer.Trigger();
|
spell_timer.Trigger();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,6 +56,7 @@ protected:
|
|||||||
int16 resist_adjust;
|
int16 resist_adjust;
|
||||||
int spell_iterations;
|
int spell_iterations;
|
||||||
Timer spell_timer;
|
Timer spell_timer;
|
||||||
|
int max_targets;
|
||||||
|
|
||||||
uint16 caster_id;
|
uint16 caster_id;
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -694,7 +694,7 @@ void EntityList::AETaunt(Client* taunter, float range, int32 bonus_hate)
|
|||||||
// causes caster to hit every mob within dist range of center with
|
// causes caster to hit every mob within dist range of center with
|
||||||
// spell_id.
|
// spell_id.
|
||||||
// NPC spells will only affect other NPCs with compatible faction
|
// NPC spells will only affect other NPCs with compatible faction
|
||||||
void EntityList::AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster, int16 resist_adjust)
|
void EntityList::AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster, int16 resist_adjust, int *max_targets)
|
||||||
{
|
{
|
||||||
Mob *curmob = nullptr;
|
Mob *curmob = nullptr;
|
||||||
|
|
||||||
@ -703,11 +703,19 @@ void EntityList::AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_
|
|||||||
float min_range2 = spells[spell_id].min_range * spells[spell_id].min_range;
|
float min_range2 = spells[spell_id].min_range * spells[spell_id].min_range;
|
||||||
float dist_targ = 0;
|
float dist_targ = 0;
|
||||||
|
|
||||||
|
const auto &position = spells[spell_id].targettype == ST_Ring ? caster->GetTargetRingLocation() : static_cast<glm::vec3>(center->GetPosition());
|
||||||
|
glm::vec2 min = { position.x - dist, position.y - dist };
|
||||||
|
glm::vec2 max = { position.x + dist, position.y + dist };
|
||||||
|
|
||||||
bool bad = IsDetrimentalSpell(spell_id);
|
bool bad = IsDetrimentalSpell(spell_id);
|
||||||
bool isnpc = caster->IsNPC();
|
bool isnpc = caster->IsNPC();
|
||||||
int MAX_TARGETS_ALLOWED = 4;
|
|
||||||
|
|
||||||
if (spells[spell_id].aemaxtargets)
|
if (RuleB(Spells, OldRainTargets))
|
||||||
|
max_targets = nullptr; // ignore it!
|
||||||
|
|
||||||
|
int MAX_TARGETS_ALLOWED = max_targets ? *max_targets : 4;
|
||||||
|
|
||||||
|
if (!max_targets && spells[spell_id].aemaxtargets)
|
||||||
MAX_TARGETS_ALLOWED = spells[spell_id].aemaxtargets;
|
MAX_TARGETS_ALLOWED = spells[spell_id].aemaxtargets;
|
||||||
|
|
||||||
int iCounter = 0;
|
int iCounter = 0;
|
||||||
@ -732,13 +740,10 @@ void EntityList::AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_
|
|||||||
continue;
|
continue;
|
||||||
if (spells[spell_id].pcnpc_only_flag == 2 && (curmob->IsClient() || curmob->IsMerc()))
|
if (spells[spell_id].pcnpc_only_flag == 2 && (curmob->IsClient() || curmob->IsMerc()))
|
||||||
continue;
|
continue;
|
||||||
|
if (!IsWithinAxisAlignedBox(static_cast<glm::vec2>(curmob->GetPosition()), min, max))
|
||||||
|
continue;
|
||||||
|
|
||||||
if (spells[spell_id].targettype == ST_Ring) {
|
dist_targ = DistanceSquared(curmob->GetPosition(), position);
|
||||||
dist_targ = DistanceSquared(static_cast<glm::vec3>(curmob->GetPosition()), caster->GetTargetRingLocation());
|
|
||||||
}
|
|
||||||
else if (center) {
|
|
||||||
dist_targ = DistanceSquared(curmob->GetPosition(), center->GetPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dist_targ > dist2) //make sure they are in range
|
if (dist_targ > dist2) //make sure they are in range
|
||||||
continue;
|
continue;
|
||||||
@ -761,9 +766,7 @@ void EntityList::AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_
|
|||||||
if (bad) {
|
if (bad) {
|
||||||
if (!caster->IsAttackAllowed(curmob, true))
|
if (!caster->IsAttackAllowed(curmob, true))
|
||||||
continue;
|
continue;
|
||||||
if (center && !spells[spell_id].npc_no_los && !center->CheckLosFN(curmob))
|
if (!spells[spell_id].npc_no_los && !caster->CheckLosFN(position.x, position.y, position.z, curmob->GetSize()))
|
||||||
continue;
|
|
||||||
if (!center && !spells[spell_id].npc_no_los && !caster->CheckLosFN(caster->GetTargetRingX(), caster->GetTargetRingY(), caster->GetTargetRingZ(), curmob->GetSize()))
|
|
||||||
continue;
|
continue;
|
||||||
} else { // check to stop casting beneficial ae buffs (to wit: bard songs) on enemies...
|
} else { // check to stop casting beneficial ae buffs (to wit: bard songs) on enemies...
|
||||||
// This does not check faction for beneficial AE buffs..only agro and attackable.
|
// This does not check faction for beneficial AE buffs..only agro and attackable.
|
||||||
@ -790,8 +793,10 @@ void EntityList::AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isnpc || spells[spell_id].aemaxtargets) //npcs are not target limited (unless casting a spell with a target limit)...
|
if (!isnpc || spells[spell_id].aemaxtargets) //npcs are not target limited (unless casting a spell with a target limit)...
|
||||||
iCounter++;
|
iCounter++; // should really pull out the MAX_TARGETS_ALLOWED calc so we can break early ...
|
||||||
}
|
}
|
||||||
|
if (max_targets)
|
||||||
|
*max_targets = *max_targets - std::min(iCounter, *max_targets); // could be higher than the count
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityList::MassGroupBuff(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster)
|
void EntityList::MassGroupBuff(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster)
|
||||||
|
|||||||
@ -357,7 +357,7 @@ public:
|
|||||||
|
|
||||||
void AEAttack(Mob *attacker, float dist, int Hand = EQEmu::inventory::slotPrimary, int count = 0, bool IsFromSpell = false);
|
void AEAttack(Mob *attacker, float dist, int Hand = EQEmu::inventory::slotPrimary, int count = 0, bool IsFromSpell = false);
|
||||||
void AETaunt(Client *caster, float range=0, int32 bonus_hate=0);
|
void AETaunt(Client *caster, float range=0, int32 bonus_hate=0);
|
||||||
void AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster = true, int16 resist_adjust = 0);
|
void AESpell(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster = true, int16 resist_adjust = 0, int *max_targets = nullptr);
|
||||||
void MassGroupBuff(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster = true);
|
void MassGroupBuff(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster = true);
|
||||||
void AEBardPulse(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster = true);
|
void AEBardPulse(Mob *caster, Mob *center, uint16 spell_id, bool affect_caster = true);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user