mirror of
https://github.com/EQEmu/Server.git
synced 2026-03-31 22:52:25 +00:00
[Fix] Change SPA 193 Weapon Damage to allow values over 65,535 (#3138)
This commit is contained in:
parent
2e2c4d64fe
commit
dc45e0d280
@ -1107,9 +1107,9 @@ public:
|
|||||||
int64 ReduceAllDamage(int64 damage);
|
int64 ReduceAllDamage(int64 damage);
|
||||||
|
|
||||||
void DoSpecialAttackDamage(Mob *who, EQ::skills::SkillType skill, int base_damage, int min_damage = 0, int32 hate_override = -1, int ReuseTime = 10);
|
void DoSpecialAttackDamage(Mob *who, EQ::skills::SkillType skill, int base_damage, int min_damage = 0, int32 hate_override = -1, int ReuseTime = 10);
|
||||||
virtual void DoThrowingAttackDmg(Mob* other, const EQ::ItemInstance* RangeWeapon = nullptr, const EQ::ItemData* AmmoItem = nullptr, uint16 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, int AmmoSlot = 0, float speed = 4.0f, bool DisableProcs = false);
|
void DoThrowingAttackDmg(Mob* other, const EQ::ItemInstance* RangeWeapon = nullptr, const EQ::ItemData* AmmoItem = nullptr, int32 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, int AmmoSlot = 0, float speed = 4.0f, bool DisableProcs = false);
|
||||||
void DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, EQ::skills::SkillType skillinuse, int16 chance_mod = 0, int16 focus = 0, bool CanRiposte = false, int ReuseTime = 0);
|
void DoMeleeSkillAttackDmg(Mob* other, int32 weapon_damage, EQ::skills::SkillType skillinuse, int16 chance_mod = 0, int16 focus = 0, bool CanRiposte = false, int ReuseTime = 0);
|
||||||
virtual void DoArcheryAttackDmg(Mob* other, const EQ::ItemInstance* RangeWeapon = nullptr, const EQ::ItemInstance* Ammo = nullptr, uint16 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, uint32 ammo_id = 0, const EQ::ItemData *AmmoItem = nullptr, int AmmoSlot = 0, float speed = 4.0f, bool DisableProcs = false);
|
void DoArcheryAttackDmg(Mob* other, const EQ::ItemInstance* RangeWeapon = nullptr, const EQ::ItemInstance* Ammo = nullptr, int32 weapon_damage = 0, int16 chance_mod = 0, int16 focus = 0, int ReuseTime = 0, uint32 range_id = 0, uint32 ammo_id = 0, const EQ::ItemData *AmmoItem = nullptr, int AmmoSlot = 0, float speed = 4.0f, bool DisableProcs = false);
|
||||||
bool TryProjectileAttack(Mob* other, const EQ::ItemData *item, EQ::skills::SkillType skillInUse, uint64 weapon_dmg, const EQ::ItemInstance* RangeWeapon, const EQ::ItemInstance* Ammo, int AmmoSlot, float speed, bool DisableProcs = false);
|
bool TryProjectileAttack(Mob* other, const EQ::ItemData *item, EQ::skills::SkillType skillInUse, uint64 weapon_dmg, const EQ::ItemInstance* RangeWeapon, const EQ::ItemInstance* Ammo, int AmmoSlot, float speed, bool DisableProcs = false);
|
||||||
void ProjectileAttack();
|
void ProjectileAttack();
|
||||||
inline bool HasProjectileAttack() const { return ActiveProjectileATK; }
|
inline bool HasProjectileAttack() const { return ActiveProjectileATK; }
|
||||||
|
|||||||
@ -747,11 +747,10 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) {
|
|||||||
LogCombat("Shooting [{}] with bow [{}] ([{}]) and arrow [{}] ([{}])", other->GetName(), RangeItem->Name, RangeItem->ID, AmmoItem->Name, AmmoItem->ID);
|
LogCombat("Shooting [{}] with bow [{}] ([{}]) and arrow [{}] ([{}])", other->GetName(), RangeItem->Name, RangeItem->ID, AmmoItem->Name, AmmoItem->ID);
|
||||||
|
|
||||||
//look for ammo in inventory if we only have 1 left...
|
//look for ammo in inventory if we only have 1 left...
|
||||||
if(Ammo->GetCharges() == 1) {
|
if (Ammo->GetCharges() == 1) {
|
||||||
//first look for quivers
|
//first look for quivers
|
||||||
int r;
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (r = EQ::invslot::GENERAL_BEGIN; r <= EQ::invslot::GENERAL_END; r++) {
|
for (int r = EQ::invslot::GENERAL_BEGIN; r <= EQ::invslot::GENERAL_END; r++) {
|
||||||
const EQ::ItemInstance *pi = m_inv[r];
|
const EQ::ItemInstance *pi = m_inv[r];
|
||||||
if (pi == nullptr || !pi->IsClassBag())
|
if (pi == nullptr || !pi->IsClassBag())
|
||||||
continue;
|
continue;
|
||||||
@ -760,16 +759,17 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
//we found a quiver, look for the ammo in it
|
//we found a quiver, look for the ammo in it
|
||||||
int i;
|
for (int i = 0; i < bagitem->BagSlots; i++) {
|
||||||
for (i = 0; i < bagitem->BagSlots; i++) {
|
const EQ::ItemInstance* baginst = pi->GetItem(i);
|
||||||
EQ::ItemInstance* baginst = pi->GetItem(i);
|
if (!baginst) {
|
||||||
if(!baginst)
|
continue;
|
||||||
continue; //empty
|
}
|
||||||
if(baginst->GetID() == Ammo->GetID()) {
|
|
||||||
|
if (baginst->GetID() == Ammo->GetID()) {
|
||||||
//we found it... use this stack
|
//we found it... use this stack
|
||||||
//the item wont change, but the instance does
|
//the item wont change, but the instance does
|
||||||
Ammo = baginst;
|
Ammo = baginst;
|
||||||
ammo_slot = m_inv.CalcSlotId(r, i);
|
ammo_slot = EQ::InventoryProfile::CalcSlotId(r, i);
|
||||||
found = true;
|
found = true;
|
||||||
LogCombat("Using ammo from quiver stack at slot [{}]. [{}] in stack", ammo_slot, Ammo->GetCharges());
|
LogCombat("Using ammo from quiver stack at slot [{}]. [{}] in stack", ammo_slot, Ammo->GetCharges());
|
||||||
break;
|
break;
|
||||||
@ -794,18 +794,17 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) {
|
|||||||
float range = RangeItem->Range + AmmoItem->Range + GetRangeDistTargetSizeMod(GetTarget());
|
float range = RangeItem->Range + AmmoItem->Range + GetRangeDistTargetSizeMod(GetTarget());
|
||||||
LogCombat("Calculated bow range to be [{}]", range);
|
LogCombat("Calculated bow range to be [{}]", range);
|
||||||
range *= range;
|
range *= range;
|
||||||
float dist = DistanceSquared(m_Position, other->GetPosition());
|
if (float dist = DistanceSquared(m_Position, other->GetPosition()); dist > range) {
|
||||||
if(dist > range) {
|
|
||||||
LogCombat("Ranged attack out of range client should catch this. ([{}] > [{}]).\n", dist, range);
|
LogCombat("Ranged attack out of range client should catch this. ([{}] > [{}]).\n", dist, range);
|
||||||
MessageString(Chat::Red,TARGET_OUT_OF_RANGE);//Client enforces range and sends the message, this is a backup just incase.
|
MessageString(Chat::Red,TARGET_OUT_OF_RANGE);//Client enforces range and sends the message, this is a backup just incase.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if(dist < (RuleI(Combat, MinRangedAttackDist)*RuleI(Combat, MinRangedAttackDist))){
|
else if (dist < (RuleI(Combat, MinRangedAttackDist)*RuleI(Combat, MinRangedAttackDist))){
|
||||||
MessageString(Chat::Yellow,RANGED_TOO_CLOSE);//Client enforces range and sends the message, this is a backup just incase.
|
MessageString(Chat::Yellow,RANGED_TOO_CLOSE);//Client enforces range and sends the message, this is a backup just incase.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!IsAttackAllowed(other) ||
|
if (!IsAttackAllowed(other) ||
|
||||||
IsCasting() ||
|
IsCasting() ||
|
||||||
IsSitting() ||
|
IsSitting() ||
|
||||||
(DivineAura() && !GetGM()) ||
|
(DivineAura() && !GetGM()) ||
|
||||||
@ -845,12 +844,12 @@ void Client::RangedAttack(Mob* other, bool CanDoubleAttack) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, const EQ::ItemInstance *Ammo,
|
void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, const EQ::ItemInstance *Ammo,
|
||||||
uint16 weapon_damage, int16 chance_mod, int16 focus, int ReuseTime, uint32 range_id,
|
int32 weapon_damage, int16 chance_mod, int16 focus, int ReuseTime, uint32 range_id,
|
||||||
uint32 ammo_id, const EQ::ItemData *AmmoItem, int AmmoSlot, float speed, bool DisableProcs)
|
uint32 ammo_id, const EQ::ItemData *AmmoItem, int AmmoSlot, float speed, bool DisableProcs)
|
||||||
{
|
{
|
||||||
if ((other == nullptr ||
|
if ((other == nullptr ||
|
||||||
((IsClient() && CastToClient()->dead) || (other->IsClient() && other->CastToClient()->dead)) ||
|
((IsClient() && CastToClient()->dead) || (other->IsClient() && other->CastToClient()->dead)) ||
|
||||||
HasDied() || (!IsAttackAllowed(other)) || (other->GetInvul() || other->GetSpecialAbility(IMMUNE_MELEE)))) {
|
HasDied() || (!IsAttackAllowed(other)) || (other->GetInvul() || other->GetSpecialAbility(IMMUNE_MELEE)))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -911,7 +910,7 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, co
|
|||||||
|
|
||||||
if (LaunchProjectile) { // 1: Shoot the Projectile once we calculate weapon damage.
|
if (LaunchProjectile) { // 1: Shoot the Projectile once we calculate weapon damage.
|
||||||
TryProjectileAttack(other, AmmoItem, EQ::skills::SkillArchery, (WDmg + ADmg), RangeWeapon,
|
TryProjectileAttack(other, AmmoItem, EQ::skills::SkillArchery, (WDmg + ADmg), RangeWeapon,
|
||||||
Ammo, AmmoSlot, speed, DisableProcs);
|
Ammo, AmmoSlot, speed, DisableProcs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -920,10 +919,14 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (WDmg > 0 || ADmg > 0) {
|
if (WDmg > 0 || ADmg > 0) {
|
||||||
if (WDmg < 0)
|
if (WDmg < 0) {
|
||||||
WDmg = 0;
|
WDmg = 0;
|
||||||
if (ADmg < 0)
|
}
|
||||||
|
|
||||||
|
if (ADmg < 0) {
|
||||||
ADmg = 0;
|
ADmg = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int MaxDmg = WDmg + ADmg;
|
int MaxDmg = WDmg + ADmg;
|
||||||
hate = ((WDmg + ADmg));
|
hate = ((WDmg + ADmg));
|
||||||
|
|
||||||
@ -934,10 +937,11 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, co
|
|||||||
LogCombat("Bow DMG [{}], Arrow DMG [{}], Max Damage [{}]", WDmg, ADmg, MaxDmg);
|
LogCombat("Bow DMG [{}], Arrow DMG [{}], Max Damage [{}]", WDmg, ADmg, MaxDmg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MaxDmg == 0)
|
if (MaxDmg == 0) {
|
||||||
MaxDmg = 1;
|
MaxDmg = 1;
|
||||||
|
}
|
||||||
|
|
||||||
DamageHitInfo my_hit;
|
DamageHitInfo my_hit {};
|
||||||
my_hit.base_damage = MaxDmg;
|
my_hit.base_damage = MaxDmg;
|
||||||
my_hit.min_damage = 0;
|
my_hit.min_damage = 0;
|
||||||
my_hit.damage_done = 1;
|
my_hit.damage_done = 1;
|
||||||
@ -953,8 +957,9 @@ void Mob::DoArcheryAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, co
|
|||||||
TotalDmg = DMG_INVULNERABLE;
|
TotalDmg = DMG_INVULNERABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsClient() && !CastToClient()->GetFeigned())
|
if (IsClient() && !CastToClient()->GetFeigned()) {
|
||||||
other->AddToHateList(this, hate, 0);
|
other->AddToHateList(this, hate, 0);
|
||||||
|
}
|
||||||
|
|
||||||
other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillArchery);
|
other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillArchery);
|
||||||
|
|
||||||
@ -1443,7 +1448,7 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Mob::DoThrowingAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, const EQ::ItemData *AmmoItem,
|
void Mob::DoThrowingAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, const EQ::ItemData *AmmoItem,
|
||||||
uint16 weapon_damage, int16 chance_mod, int16 focus, int ReuseTime, uint32 range_id,
|
int32 weapon_damage, int16 chance_mod, int16 focus, int ReuseTime, uint32 range_id,
|
||||||
int AmmoSlot, float speed, bool DisableProcs)
|
int AmmoSlot, float speed, bool DisableProcs)
|
||||||
{
|
{
|
||||||
if ((other == nullptr ||
|
if ((other == nullptr ||
|
||||||
@ -1490,7 +1495,7 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, c
|
|||||||
int WDmg = 0;
|
int WDmg = 0;
|
||||||
|
|
||||||
if (!weapon_damage) {
|
if (!weapon_damage) {
|
||||||
if (IsClient() && RangeWeapon) {
|
if (IsOfClientBot() && RangeWeapon) {
|
||||||
WDmg = GetWeaponDamage(other, RangeWeapon);
|
WDmg = GetWeaponDamage(other, RangeWeapon);
|
||||||
}
|
}
|
||||||
else if (AmmoItem) {
|
else if (AmmoItem) {
|
||||||
@ -1514,7 +1519,7 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, c
|
|||||||
int TotalDmg = 0;
|
int TotalDmg = 0;
|
||||||
|
|
||||||
if (WDmg > 0) {
|
if (WDmg > 0) {
|
||||||
DamageHitInfo my_hit;
|
DamageHitInfo my_hit {};
|
||||||
my_hit.base_damage = WDmg;
|
my_hit.base_damage = WDmg;
|
||||||
my_hit.min_damage = 0;
|
my_hit.min_damage = 0;
|
||||||
my_hit.damage_done = 1;
|
my_hit.damage_done = 1;
|
||||||
@ -1533,8 +1538,9 @@ void Mob::DoThrowingAttackDmg(Mob *other, const EQ::ItemInstance *RangeWeapon, c
|
|||||||
TotalDmg = DMG_INVULNERABLE;
|
TotalDmg = DMG_INVULNERABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsClient() && !CastToClient()->GetFeigned())
|
if (IsClient() && !CastToClient()->GetFeigned()) {
|
||||||
other->AddToHateList(this, WDmg, 0);
|
other->AddToHateList(this, WDmg, 0);
|
||||||
|
}
|
||||||
|
|
||||||
other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillThrowing);
|
other->Damage(this, TotalDmg, SPELL_UNKNOWN, EQ::skills::SkillThrowing);
|
||||||
|
|
||||||
@ -2299,11 +2305,12 @@ int Mob::TryAssassinate(Mob *defender, EQ::skills::SkillType skillInUse)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQ::skills::SkillType skillinuse, int16 chance_mod,
|
void Mob::DoMeleeSkillAttackDmg(Mob *other, int32 weapon_damage, EQ::skills::SkillType skillinuse, int16 chance_mod,
|
||||||
int16 focus, bool CanRiposte, int ReuseTime)
|
int16 focus, bool CanRiposte, int ReuseTime)
|
||||||
{
|
{
|
||||||
if (!CanDoSpecialAttack(other))
|
if (!CanDoSpecialAttack(other)) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
For spells using skill value 98 (feral swipe ect) server sets this to 67 automatically.
|
For spells using skill value 98 (feral swipe ect) server sets this to 67 automatically.
|
||||||
@ -2311,34 +2318,34 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQ::skills::Sk
|
|||||||
TODO: We need to stop moving skill 98, it's suppose to just be a dummy skill AFAIK
|
TODO: We need to stop moving skill 98, it's suppose to just be a dummy skill AFAIK
|
||||||
Spells using offense should use the skill of your primary, if you can use it, otherwise h2h
|
Spells using offense should use the skill of your primary, if you can use it, otherwise h2h
|
||||||
*/
|
*/
|
||||||
if (skillinuse == EQ::skills::SkillBegging)
|
if (skillinuse == EQ::skills::SkillBegging) {
|
||||||
skillinuse = EQ::skills::SkillOffense;
|
skillinuse = EQ::skills::SkillOffense;
|
||||||
|
}
|
||||||
|
|
||||||
int64 damage = 0;
|
int64 damage = 0;
|
||||||
int64 hate = 0;
|
int64 hate = 0;
|
||||||
if (hate == 0 && weapon_damage > 1)
|
if (hate == 0 && weapon_damage > 1) {
|
||||||
hate = weapon_damage;
|
hate = weapon_damage;
|
||||||
|
}
|
||||||
|
|
||||||
if (weapon_damage > 0) {
|
if (weapon_damage > 0) {
|
||||||
if (focus) {
|
if (focus) {
|
||||||
weapon_damage += weapon_damage * focus / 100;
|
weapon_damage += weapon_damage * focus / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skillinuse == EQ::skills::SkillBash) {
|
if (skillinuse == EQ::skills::SkillBash && IsClient()) {
|
||||||
if (IsClient()) {
|
EQ::ItemInstance *item =
|
||||||
EQ::ItemInstance *item =
|
CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary);
|
||||||
CastToClient()->GetInv().GetItem(EQ::invslot::slotSecondary);
|
if (item) {
|
||||||
if (item) {
|
if (item->GetItem()->ItemType == EQ::item::ItemTypeShield) {
|
||||||
if (item->GetItem()->ItemType == EQ::item::ItemTypeShield) {
|
hate += item->GetItem()->AC;
|
||||||
hate += item->GetItem()->AC;
|
|
||||||
}
|
|
||||||
const EQ::ItemData *itm = item->GetItem();
|
|
||||||
hate = hate * (100 + GetFuriousBash(itm->Focus.Effect)) / 100;
|
|
||||||
}
|
}
|
||||||
|
const EQ::ItemData *itm = item->GetItem();
|
||||||
|
hate = hate * (100 + GetFuriousBash(itm->Focus.Effect)) / 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DamageHitInfo my_hit;
|
DamageHitInfo my_hit {};
|
||||||
my_hit.base_damage = weapon_damage;
|
my_hit.base_damage = weapon_damage;
|
||||||
my_hit.min_damage = 0;
|
my_hit.min_damage = 0;
|
||||||
my_hit.damage_done = 1;
|
my_hit.damage_done = 1;
|
||||||
@ -2349,8 +2356,9 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQ::skills::Sk
|
|||||||
// slot range exclude ripe etc ...
|
// slot range exclude ripe etc ...
|
||||||
my_hit.hand = CanRiposte ? EQ::invslot::slotRange : EQ::invslot::slotPrimary;
|
my_hit.hand = CanRiposte ? EQ::invslot::slotRange : EQ::invslot::slotPrimary;
|
||||||
|
|
||||||
if (IsNPC())
|
if (IsNPC()) {
|
||||||
my_hit.min_damage = CastToNPC()->GetMinDamage();
|
my_hit.min_damage = CastToNPC()->GetMinDamage();
|
||||||
|
}
|
||||||
|
|
||||||
DoAttack(other, my_hit);
|
DoAttack(other, my_hit);
|
||||||
damage = my_hit.damage_done;
|
damage = my_hit.damage_done;
|
||||||
@ -2365,8 +2373,9 @@ void Mob::DoMeleeSkillAttackDmg(Mob *other, uint16 weapon_damage, EQ::skills::Sk
|
|||||||
other->AddToHateList(this, hate, 0);
|
other->AddToHateList(this, hate, 0);
|
||||||
other->Damage(this, damage, SPELL_UNKNOWN, skillinuse);
|
other->Damage(this, damage, SPELL_UNKNOWN, skillinuse);
|
||||||
|
|
||||||
if (HasDied())
|
if (HasDied()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
TryCastOnSkillUse(other, skillinuse);
|
TryCastOnSkillUse(other, skillinuse);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user