mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-19 17:38:26 +00:00
[Feature] Implemented /shield ability and related affects (#1494)
* shield ability initial work
* updates
* update
* updates
* Update client_process.cpp
* major updates
optimized
pet support
perl support
* updates
* minor update
* fix merge error
* requested changes
* variable fix
* optimization
* minor update
* Revert "optimization"
This reverts commit 27e11e758b.
* fix
reset variables on shield_target if shielder dies or zones during shielding.
* edge case fix
Catch and fix situations where shield target doesn't have shielder variable cleared. Can occur if shielder . uses ability when target is not in combat then zones.
* combined packet and mob function
Shield now uses a common pathway through ShieldAbility, added parameters to perl function
* Addressing formatting for Kayen
* Fix function typo
Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
+46
-40
@@ -4179,44 +4179,6 @@ XS(XS_Mob_GetResist) {
|
||||
XSRETURN(1);
|
||||
}
|
||||
|
||||
XS(XS_Mob_GetShieldTarget); /* prototype to pass -Wmissing-prototypes */
|
||||
XS(XS_Mob_GetShieldTarget) {
|
||||
dXSARGS;
|
||||
if (items != 1)
|
||||
Perl_croak(aTHX_ "Usage: Mob::GetShieldTarget(THIS)"); // @categories Script Utility
|
||||
{
|
||||
Mob *THIS;
|
||||
Mob *RETVAL;
|
||||
VALIDATE_THIS_IS_MOB;
|
||||
RETVAL = THIS->GetShieldTarget();
|
||||
ST(0) = sv_newmortal();
|
||||
sv_setref_pv(ST(0), "Mob", (void *) RETVAL);
|
||||
}
|
||||
XSRETURN(1);
|
||||
}
|
||||
|
||||
XS(XS_Mob_SetShieldTarget); /* prototype to pass -Wmissing-prototypes */
|
||||
XS(XS_Mob_SetShieldTarget) {
|
||||
dXSARGS;
|
||||
if (items != 2)
|
||||
Perl_croak(aTHX_ "Usage: Mob::SetShieldTarget(THIS, mob)"); // @categories Script Utility
|
||||
{
|
||||
Mob *THIS;
|
||||
Mob *mob;
|
||||
VALIDATE_THIS_IS_MOB;
|
||||
if (sv_derived_from(ST(1), "Mob")) {
|
||||
IV tmp = SvIV((SV *) SvRV(ST(1)));
|
||||
mob = INT2PTR(Mob *, tmp);
|
||||
} else
|
||||
Perl_croak(aTHX_ "mob is not of type Mob");
|
||||
if (mob == nullptr)
|
||||
Perl_croak(aTHX_ "mob is nullptr, avoiding crash.");
|
||||
|
||||
THIS->SetShieldTarget(mob);
|
||||
}
|
||||
XSRETURN_EMPTY;
|
||||
}
|
||||
|
||||
XS(XS_Mob_Charmed); /* prototype to pass -Wmissing-prototypes */
|
||||
XS(XS_Mob_Charmed) {
|
||||
dXSARGS;
|
||||
@@ -6301,6 +6263,51 @@ XS(XS_Mob_AddNimbusEffect) {
|
||||
XSRETURN_EMPTY;
|
||||
}
|
||||
|
||||
XS(XS_Mob_ShieldAbility); /* prototype to pass -Wmissing-prototypes */
|
||||
XS(XS_Mob_ShieldAbility) {
|
||||
dXSARGS;
|
||||
if (items < 2 || items > 6)
|
||||
Perl_croak(aTHX_ "Usage: Mob::ShieldAbility(THIS, uint32 target_id, [int32 shielder__max_distance = 15], [int32 shield_duration = 12000], [int32 shield_target_mitigation= 50], [int32 shielder_mitigation = 50], [bool use_aa = false], bool [can_shield_npc = true]"); // @categories Spells and Disciplines
|
||||
{
|
||||
Mob *THIS;
|
||||
uint32 target_id = (uint32)SvUV(ST(1));
|
||||
int32 shielder_max_distance = (int32)SvUV(ST(2));
|
||||
int32 shield_duration = (int32)SvUV(ST(3));
|
||||
int32 shield_target_mitigation = (int32)SvUV(ST(4));
|
||||
int32 shielder_mitigation = (int32)SvUV(ST(5));
|
||||
bool use_aa = (bool)SvTRUE(ST(6));
|
||||
bool can_shield_npc = (bool)SvTRUE(ST(7));
|
||||
|
||||
VALIDATE_THIS_IS_MOB;
|
||||
if (items < 3) {
|
||||
shielder_max_distance = 15;
|
||||
}
|
||||
|
||||
if (items < 4) {
|
||||
shield_duration = 12000;
|
||||
}
|
||||
|
||||
if (items < 5) {
|
||||
shield_target_mitigation = 50;
|
||||
}
|
||||
|
||||
if (items < 6) {
|
||||
shielder_mitigation = 50;
|
||||
}
|
||||
|
||||
if (items < 7) {
|
||||
use_aa = false;
|
||||
}
|
||||
|
||||
if (items < 8) {
|
||||
can_shield_npc = true;
|
||||
}
|
||||
THIS->ShieldAbility(target_id, shielder_max_distance, shield_duration, shield_duration, shield_duration, use_aa, can_shield_npc);
|
||||
|
||||
}
|
||||
XSRETURN_EMPTY;
|
||||
}
|
||||
|
||||
#ifdef BOTS
|
||||
XS(XS_Mob_CastToBot); /* prototype to pass -Wmissing-prototypes */
|
||||
XS(XS_Mob_CastToBot)
|
||||
@@ -6561,8 +6568,6 @@ XS(boot_Mob) {
|
||||
newXSproto(strcpy(buf, "DontRootMeBefore"), XS_Mob_DontRootMeBefore, file, "$");
|
||||
newXSproto(strcpy(buf, "DontSnareMeBefore"), XS_Mob_DontSnareMeBefore, file, "$");
|
||||
newXSproto(strcpy(buf, "GetResist"), XS_Mob_GetResist, file, "$$");
|
||||
newXSproto(strcpy(buf, "GetShieldTarget"), XS_Mob_GetShieldTarget, file, "$");
|
||||
newXSproto(strcpy(buf, "SetShieldTarget"), XS_Mob_SetShieldTarget, file, "$$");
|
||||
newXSproto(strcpy(buf, "Charmed"), XS_Mob_Charmed, file, "$");
|
||||
newXSproto(strcpy(buf, "GetLevelHP"), XS_Mob_GetLevelHP, file, "$$");
|
||||
newXSproto(strcpy(buf, "GetZoneID"), XS_Mob_GetZoneID, file, "$");
|
||||
@@ -6672,6 +6677,7 @@ XS(boot_Mob) {
|
||||
newXSproto(strcpy(buf, "CanRaceEquipItem"), XS_Mob_CanRaceEquipItem, file, "$$");
|
||||
newXSproto(strcpy(buf, "RemoveAllNimbusEffects"), XS_Mob_RemoveAllNimbusEffects, file, "$");
|
||||
newXSproto(strcpy(buf, "AddNimbusEffect"), XS_Mob_AddNimbusEffect, file, "$$");
|
||||
newXSproto(strcpy(buf, "ShieldAbility"), XS_Mob_ShieldAbility, file, "$$$$$$$$");
|
||||
#ifdef BOTS
|
||||
newXSproto(strcpy(buf, "CastToBot"), XS_Mob_CastToBot, file, "$");
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user