From fb98349bbd25b965e57688070a11b4788f9d26cf Mon Sep 17 00:00:00 2001 From: hg <4683435+hgtw@users.noreply.github.com> Date: Fri, 1 Oct 2021 23:11:16 -0400 Subject: [PATCH] [Quest API] Add mob SetPet and RemovePet quest apis (#1569) Will be required for tutoriala script and other similar events --- zone/lua_mob.cpp | 12 ++++++++++++ zone/lua_mob.h | 2 ++ zone/perl_mob.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index 72f10be76..3c2781c28 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -2194,6 +2194,16 @@ bool Lua_Mob::HasPet() { return self->HasPet(); } +void Lua_Mob::RemovePet() { + Lua_Safe_Call_Void(); + return self->SetPet(nullptr); +} + +void Lua_Mob::SetPet(Lua_Mob new_pet) { + Lua_Safe_Call_Void(); + return self->SetPet(new_pet); +} + bool Lua_Mob::IsSilenced() { Lua_Safe_Call_Bool(); return self->IsSilenced(); @@ -2769,6 +2779,8 @@ luabind::scope lua_register_mob() { .def("HasOwner", (bool(Lua_Mob::*)(void))&Lua_Mob::HasOwner) .def("IsPet", (bool(Lua_Mob::*)(void))&Lua_Mob::IsPet) .def("HasPet", (bool(Lua_Mob::*)(void))&Lua_Mob::HasPet) + .def("RemovePet", &Lua_Mob::RemovePet) + .def("SetPet", &Lua_Mob::SetPet) .def("IsSilenced", (bool(Lua_Mob::*)(void))&Lua_Mob::IsSilenced) .def("IsAmnesiad", (bool(Lua_Mob::*)(void))&Lua_Mob::IsAmnesiad) .def("GetMeleeMitigation", (int32(Lua_Mob::*)(void))&Lua_Mob::GetMeleeMitigation) diff --git a/zone/lua_mob.h b/zone/lua_mob.h index ebe4a59d0..cd3e524cb 100644 --- a/zone/lua_mob.h +++ b/zone/lua_mob.h @@ -412,6 +412,8 @@ public: bool HasOwner(); bool IsPet(); bool HasPet(); + void RemovePet(); + void SetPet(Lua_Mob new_pet); bool IsSilenced(); bool IsAmnesiad(); int32 GetMeleeMitigation(); diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index aa7a2eaab..ff8bc48b9 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -5945,6 +5945,43 @@ XS(XS_Mob_HasPet) { XSRETURN(1); } +XS(XS_Mob_RemovePet); +XS(XS_Mob_RemovePet) { + dXSARGS; + if (items != 1) { + Perl_croak(aTHX_ "Usage: Mob::RemovePet(THIS)"); // @categories Pet + } + + Mob* THIS; + VALIDATE_THIS_IS_MOB; + + THIS->SetPet(nullptr); + + XSRETURN_EMPTY; +} + +XS(XS_Mob_SetPet); +XS(XS_Mob_SetPet) { + dXSARGS; + if (items != 2) { + Perl_croak(aTHX_ "Usage: Mob::SetPet(THIS, Mob* new_pet)"); // @categories Pet + } + + Mob* THIS; + VALIDATE_THIS_IS_MOB; + + Mob* new_pet = nullptr; // passing null or invalid new_pet removes pet + if (sv_derived_from(ST(1), "Mob")) + { + IV tmp = SvIV((SV*)SvRV(ST(1))); + new_pet = INT2PTR(Mob*, tmp); + } + + THIS->SetPet(new_pet); + + XSRETURN_EMPTY; +} + XS(XS_Mob_IsSilenced); XS(XS_Mob_IsSilenced) { dXSARGS; @@ -6673,6 +6710,8 @@ XS(boot_Mob) { newXSproto(strcpy(buf, "HasOwner"), XS_Mob_HasOwner, file, "$"); newXSproto(strcpy(buf, "IsPet"), XS_Mob_IsPet, file, "$"); newXSproto(strcpy(buf, "HasPet"), XS_Mob_HasPet, file, "$"); + newXSproto(strcpy(buf, "RemovePet"), XS_Mob_RemovePet, file, "$"); + newXSproto(strcpy(buf, "SetPet"), XS_Mob_SetPet, file, "$$"); newXSproto(strcpy(buf, "IsSilenced"), XS_Mob_IsSilenced, file, "$"); newXSproto(strcpy(buf, "IsAmnesiad"), XS_Mob_IsAmnesiad, file, "$"); newXSproto(strcpy(buf, "GetMeleeMitigation"), XS_Mob_GetMeleeMitigation, file, "$");