[Quest API] Add CanRaceEquipItem(item_id) to Perl/Lua. (#1411)

* [Quest API] Add CanRaceEquipItem(item_id) to Perl/Lua.
- Add $mob->CanRaceEquipItem(item_id) to Perl.
- Add mob:CanClassEquipItem(item_id) to Lua.
- Add mob:CanRaceEquipItem(item_id) to Lua.

* Use constants.

Co-authored-by: Chris Miles <akkadius1@gmail.com>
This commit is contained in:
Alex 2021-06-17 18:42:44 -04:00 committed by GitHub
parent ccfc8b296f
commit 249cbb7bc7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 73 additions and 10 deletions

View File

@ -2364,6 +2364,16 @@ const char *Lua_Mob::GetLastName() {
return self->GetLastName();
}
bool Lua_Mob::CanClassEquipItem(uint32 item_id) {
Lua_Safe_Call_Bool();
return self->CanClassEquipItem(item_id);
}
bool Lua_Mob::CanRaceEquipItem(uint32 item_id) {
Lua_Safe_Call_Bool();
return self->CanRaceEquipItem(item_id);
}
void Lua_Mob::RemoveAllNimbusEffects() {
Lua_Safe_Call_Void();
self->RemoveAllNimbusEffects();
@ -2773,6 +2783,8 @@ luabind::scope lua_register_mob() {
.def("SetBucket", (void(Lua_Mob::*)(std::string,std::string,std::string))&Lua_Mob::SetBucket)
.def("IsHorse", &Lua_Mob::IsHorse)
.def("GetLastName", &Lua_Mob::GetLastName)
.def("CanClassEquipItem", &Lua_Mob::CanClassEquipItem)
.def("CanRaceEquipItem", &Lua_Mob::CanRaceEquipItem)
.def("RemoveAllNimbusEffects", &Lua_Mob::RemoveAllNimbusEffects);
}

View File

@ -431,7 +431,6 @@ public:
int GetBodyType();
int GetOrigBodyType();
void CheckNumHitsRemaining(int type, int32 buff_slot, uint16 spell_id);
void DeleteBucket(std::string bucket_name);
std::string GetBucket(std::string bucket_name);
std::string GetBucketExpires(std::string bucket_name);
@ -440,6 +439,8 @@ public:
void SetBucket(std::string bucket_name, std::string bucket_value);
void SetBucket(std::string bucket_name, std::string bucket_value, std::string expiration);
bool IsHorse();
bool CanClassEquipItem(uint32 item_id);
bool CanRaceEquipItem(uint32 item_id);
};
#endif

View File

@ -5673,22 +5673,53 @@ bool Mob::CanClassEquipItem(uint32 item_id)
const EQ::ItemData* itm = nullptr;
itm = database.GetItem(item_id);
if (!itm)
if (!itm) {
return false;
}
if(itm->Classes == 65535 )
auto item_classes = itm->Classes;
if(item_classes == PLAYER_CLASS_ALL_MASK) {
return true;
}
if (GetClass() > 16)
auto class_id = GetClass();
if (class_id > BERSERKER) {
return false;
}
int bitmask = 1;
bitmask = bitmask << (GetClass() - 1);
if(!(itm->Classes & bitmask))
int class_bitmask = GetPlayerClassBit(class_id);
if(!(item_classes & class_bitmask)) {
return false;
else
} else {
return true;
}
}
bool Mob::CanRaceEquipItem(uint32 item_id)
{
const EQ::ItemData* itm = nullptr;
itm = database.GetItem(item_id);
if (!itm) {
return false;
}
auto item_races = itm->Races;
if(item_races == PLAYER_RACE_ALL_MASK) {
return true;
}
auto race_id = GetBaseRace();
if (!IsPlayerRace(race_id)) {
return false;
}
int race_bitmask = GetPlayerRaceBit(race_id);
if(!(item_races & race_bitmask)) {
return false;
} else {
return true;
}
}
void Mob::SendAddPlayerState(PlayerState new_state)

View File

@ -441,6 +441,7 @@ public:
virtual uint32 GetEquipmentColor(uint8 material_slot) const;
virtual uint32 IsEliteMaterialItem(uint8 material_slot) const;
bool CanClassEquipItem(uint32 item_id);
bool CanRaceEquipItem(uint32 item_id);
bool AffectedBySpellExcludingSlot(int slot, int effect);
virtual bool Death(Mob* killerMob, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill) = 0;
virtual void Damage(Mob* from, int32 damage, uint16 spell_id, EQ::skills::SkillType attack_skill,

View File

@ -5652,7 +5652,7 @@ XS(XS_Mob_CanClassEquipItem) {
uint32 item_id = (uint32) SvUV(ST(1));
VALIDATE_THIS_IS_MOB;
RETVAL = THIS->CanClassEquipItem(item_id);
ST(0) = boolSV(RETVAL);
ST(0) = boolSV(RETVAL);
sv_2mortal(ST(0));
}
XSRETURN(1);
@ -6257,6 +6257,23 @@ XS(XS_Mob_GetLastName) {
XSRETURN(1);
}
XS(XS_Mob_CanRaceEquipItem); /* prototype to pass -Wmissing-prototypes */
XS(XS_Mob_CanRaceEquipItem) {
dXSARGS;
if (items != 2)
Perl_croak(aTHX_ "Usage: Mob::CanRaceEquipItem(THIS, uint32 item_id)"); // @categories Inventory and Items, Script Utility
{
Mob *THIS;
bool RETVAL;
uint32 item_id = (uint32) SvUV(ST(1));
VALIDATE_THIS_IS_MOB;
RETVAL = THIS->CanRaceEquipItem(item_id);
ST(0) = boolSV(RETVAL);
sv_2mortal(ST(0));
}
XSRETURN(1);
}
XS(XS_Mob_RemoveAllNimbusEffects); /* prototype to pass -Wmissing-prototypes */
XS(XS_Mob_RemoveAllNimbusEffects) {
dXSARGS;
@ -6652,6 +6669,7 @@ XS(boot_Mob) {
newXSproto(strcpy(buf, "GetHateClosest"), XS_Mob_GetHateClosest, file, "$");
newXSproto(strcpy(buf, "GetHateListByDistance"), XS_Mob_GetHateListByDistance, file, "$;$");
newXSproto(strcpy(buf, "GetLastName"), XS_Mob_GetLastName, file, "$");
newXSproto(strcpy(buf, "CanRaceEquipItem"), XS_Mob_CanRaceEquipItem, file, "$$");
newXSproto(strcpy(buf, "RemoveAllNimbusEffects"), XS_Mob_RemoveAllNimbusEffects, file, "$");
newXSproto(strcpy(buf, "AddNimbusEffect"), XS_Mob_AddNimbusEffect, file, "$$");
#ifdef BOTS