[Quest API] Add Instance Methods to Perl/Lua. (#2573)

* [Quest API] Add Instance Methods to Perl/Lua.

# Perl
- Add `quest::GetInstanceIDs(zone_name)`.
- Add `quest::GetInstanceIDsByCharID(zone_name, character_id)`.
- Add `quest::GetInstanceVersionByID(instance_id)`.
- Add `quest::GetInstanceZoneIDByID(instance_id)`.

# Lua
- Add `eq.get_instance_ids(zone_name)`.
- Add `eq.get_instance_ids_by_char_id(zone_name, character_id)`.
- Add `eq.get_instance_version_by_id(instance_id)`.
- Add `eq.get_instance_zone_id_by_id(instance_id)`.

# Notes
- The instance IDs methods return arrays of IDs for looping so you can check on mass the instances a player has for a zone.
- Keeps operators from having to guess which possible versions of a zone a player has an instance for or loop through them all to find out.
- Cleanup `common/database_instances.cpp` to mostly use repositories where possible.

* Update database.h

* Update character_corpses_repository.h
This commit is contained in:
Alex King
2022-11-26 10:43:29 -05:00
committed by GitHub
parent 1d1ffc66fe
commit b91d879662
10 changed files with 382 additions and 328 deletions
+53 -15
View File
@@ -1464,23 +1464,57 @@ int Perl__GetInstanceID(const char* zone_name, uint16 version)
return quest_manager.GetInstanceID(zone_name, version);
}
int Perl__GetInstanceIDByCharID(const char* zone_name, int16 version, uint32 char_id)
uint8 Perl__GetInstanceVersionByID(uint16 instance_id)
{
return quest_manager.GetInstanceIDByCharID(zone_name, version, char_id);
return database.GetInstanceVersion(instance_id);
}
uint32 Perl__GetInstanceZoneIDByID(uint16 instance_id)
{
return database.GetInstanceZoneID(instance_id);
}
perl::array Perl__GetInstanceIDs(std::string zone_name)
{
perl::array result;
const auto instance_ids = quest_manager.GetInstanceIDs(zone_name);
for (int i = 0; i < instance_ids.size(); i++) {
result.push_back(instance_ids[i]);
}
return result;
}
int Perl__GetInstanceIDByCharID(const char* zone_name, int16 version, uint32 character_id)
{
return quest_manager.GetInstanceIDByCharID(zone_name, version, character_id);
}
perl::array Perl__GetInstanceIDsByCharID(std::string zone_name, uint32 character_id)
{
perl::array result;
const auto instance_ids = quest_manager.GetInstanceIDs(zone_name, character_id);
for (int i = 0; i < instance_ids.size(); i++) {
result.push_back(instance_ids[i]);
}
return result;
}
std::string Perl__GetCharactersInInstance(uint16 instance_id)
{
std::list<uint32> char_id_list;
std::list<uint32> character_ids;
std::string char_id_string = "No players in that instance.";
database.GetCharactersInInstance(instance_id, char_id_list);
database.GetCharactersInInstance(instance_id, character_ids);
if (char_id_list.size() > 0)
if (character_ids.size() > 0)
{
char_id_string = fmt::format("{} player(s) in instance: ", char_id_list.size());
auto iter = char_id_list.begin();
while (iter != char_id_list.end()) {
char_id_string = fmt::format("{} player(s) in instance: ", character_ids.size());
auto iter = character_ids.begin();
while (iter != character_ids.end()) {
char char_name[64];
database.GetCharName(*iter, char_name);
char_id_string += char_name;
@@ -1488,7 +1522,7 @@ std::string Perl__GetCharactersInInstance(uint16 instance_id)
char_id_string += itoa(*iter);
char_id_string += ")";
++iter;
if (iter != char_id_list.end())
if (iter != character_ids.end())
char_id_string += ", ";
}
}
@@ -1501,9 +1535,9 @@ void Perl__AssignToInstance(uint16 instance_id)
quest_manager.AssignToInstance(instance_id);
}
void Perl__AssignToInstanceByCharID(uint16 instance_id, uint32 char_id)
void Perl__AssignToInstanceByCharID(uint16 instance_id, uint32 character_id)
{
quest_manager.AssignToInstanceByCharID(instance_id, char_id);
quest_manager.AssignToInstanceByCharID(instance_id, character_id);
}
void Perl__AssignGroupToInstance(uint16 instance_id)
@@ -1521,14 +1555,14 @@ void Perl__RemoveFromInstance(uint16 instance_id)
quest_manager.RemoveFromInstance(instance_id);
}
void Perl__RemoveFromInstanceByCharID(uint16 instance_id, uint32 char_id)
void Perl__RemoveFromInstanceByCharID(uint16 instance_id, uint32 character_id)
{
quest_manager.RemoveFromInstanceByCharID(instance_id, char_id);
quest_manager.RemoveFromInstanceByCharID(instance_id, character_id);
}
bool Perl__CheckInstanceByCharID(uint16 instance_id, uint32 char_id)
bool Perl__CheckInstanceByCharID(uint16 instance_id, uint32 character_id)
{
return quest_manager.CheckInstanceByCharID(instance_id, char_id);
return quest_manager.CheckInstanceByCharID(instance_id, character_id);
}
void Perl__RemoveAllFromInstance(uint16 instance_id)
@@ -3913,6 +3947,10 @@ void perl_register_quest()
package.add("GetCharactersInInstance", &Perl__GetCharactersInInstance);
package.add("GetInstanceID", &Perl__GetInstanceID);
package.add("GetInstanceIDByCharID", &Perl__GetInstanceIDByCharID);
package.add("GetInstanceIDs", &Perl__GetInstanceIDs);
package.add("GetInstanceIDsByCharID", &Perl__GetInstanceIDsByCharID);
package.add("GetInstanceVersionByID", &Perl__GetInstanceVersionByID);
package.add("GetInstanceZoneIDByID", &Perl__GetInstanceZoneIDByID);
package.add("GetSpellResistType", &Perl__GetSpellResistType);
package.add("GetSpellTargetType", &Perl__GetSpellTargetType);
package.add("GetTimeSeconds", &Perl__GetTimeSeconds);
+3 -3
View File
@@ -97,9 +97,9 @@ void command_instance(Client *c, const Seperator *sep)
return;
}
uint32 zone_id = database.ZoneIDFromInstanceID(instance_id);
uint32 version = database.VersionFromInstanceID(instance_id);
uint32 current_id = database.GetInstanceID(zone_id, character_id, version);
auto zone_id = database.GetInstanceZoneID(instance_id);
auto version = database.GetInstanceVersion(instance_id);
auto current_id = database.GetInstanceID(zone_id, character_id, version);
if (!current_id) {
c->Message(
Chat::White,
+4 -4
View File
@@ -25,7 +25,7 @@ void command_zone_instance(Client *c, const Seperator *sep)
return;
}
auto zone_id = database.ZoneIDFromInstanceID(instance_id);
auto zone_id = database.GetInstanceZoneID(instance_id);
if (!zone_id) {
c->Message(
Chat::White,
@@ -36,11 +36,11 @@ void command_zone_instance(Client *c, const Seperator *sep)
);
return;
}
if (!database.CharacterInInstanceGroup(instance_id, c->CharacterID())) {
if (!database.CheckInstanceByCharID(instance_id, c->CharacterID())) {
database.AddClientToInstance(instance_id, c->CharacterID());
}
if (!database.VerifyInstanceAlive(instance_id, c->CharacterID())) {
c->Message(
Chat::White,
+46 -12
View File
@@ -1002,16 +1002,46 @@ int lua_get_instance_id(const char *zone, uint32 version) {
return quest_manager.GetInstanceID(zone, version);
}
int lua_get_instance_id_by_char_id(const char *zone, uint32 version, uint32 char_id) {
return quest_manager.GetInstanceIDByCharID(zone, version, char_id);
uint8 lua_get_instance_version_by_id(uint16 instance_id) {
return database.GetInstanceVersion(instance_id);
}
uint32 lua_get_instance_zone_id_by_id(uint16 instance_id) {
return database.GetInstanceZoneID(instance_id);
}
luabind::adl::object lua_get_instance_ids(lua_State* L, std::string zone_name) {
luabind::adl::object ret = luabind::newtable(L);
auto instance_ids = quest_manager.GetInstanceIDs(zone_name);
for (int i = 0; i < instance_ids.size(); i++) {
ret[i] = instance_ids[i];
}
return ret;
}
luabind::adl::object lua_get_instance_ids_by_char_id(lua_State* L, std::string zone_name, uint32 character_id) {
luabind::adl::object ret = luabind::newtable(L);
auto instance_ids = quest_manager.GetInstanceIDs(zone_name, character_id);
for (int i = 0; i < instance_ids.size(); i++) {
ret[i] = instance_ids[i];
}
return ret;
}
int lua_get_instance_id_by_char_id(const char *zone, uint32 version, uint32 character_id) {
return quest_manager.GetInstanceIDByCharID(zone, version, character_id);
}
void lua_assign_to_instance(uint32 instance_id) {
quest_manager.AssignToInstance(instance_id);
}
void lua_assign_to_instance_by_char_id(uint32 instance_id, uint32 char_id) {
quest_manager.AssignToInstanceByCharID(instance_id, char_id);
void lua_assign_to_instance_by_char_id(uint32 instance_id, uint32 character_id) {
quest_manager.AssignToInstanceByCharID(instance_id, character_id);
}
void lua_assign_group_to_instance(uint32 instance_id) {
@@ -1026,12 +1056,12 @@ void lua_remove_from_instance(uint32 instance_id) {
quest_manager.RemoveFromInstance(instance_id);
}
void lua_remove_from_instance_by_char_id(uint32 instance_id, uint32 char_id) {
quest_manager.RemoveFromInstanceByCharID(instance_id, char_id);
void lua_remove_from_instance_by_char_id(uint32 instance_id, uint32 character_id) {
quest_manager.RemoveFromInstanceByCharID(instance_id, character_id);
}
bool lua_check_instance_by_char_id(uint32 instance_id, uint32 char_id) {
return quest_manager.CheckInstanceByCharID(instance_id, char_id);
bool lua_check_instance_by_char_id(uint32 instance_id, uint32 character_id) {
return quest_manager.CheckInstanceByCharID(instance_id, character_id);
}
void lua_remove_all_from_instance(uint32 instance_id) {
@@ -1215,11 +1245,11 @@ int lua_get_zone_instance_version() {
luabind::adl::object lua_get_characters_in_instance(lua_State *L, uint16 instance_id) {
luabind::adl::object ret = luabind::newtable(L);
std::list<uint32> charid_list;
std::list<uint32> character_ids;
uint16 i = 1;
database.GetCharactersInInstance(instance_id,charid_list);
auto iter = charid_list.begin();
while(iter != charid_list.end()) {
database.GetCharactersInInstance(instance_id, character_ids);
auto iter = character_ids.begin();
while(iter != character_ids.end()) {
ret[i] = *iter;
++i;
++iter;
@@ -3957,8 +3987,12 @@ luabind::scope lua_register_general() {
luabind::def("update_instance_timer", &lua_update_instance_timer),
luabind::def("get_instance_id", &lua_get_instance_id),
luabind::def("get_instance_id_by_char_id", &lua_get_instance_id_by_char_id),
luabind::def("get_instance_ids", &lua_get_instance_ids),
luabind::def("get_instance_ids_by_char_id", &lua_get_instance_id_by_char_id),
luabind::def("get_instance_timer", &lua_get_instance_timer),
luabind::def("get_instance_timer_by_id", &lua_get_instance_timer_by_id),
luabind::def("get_instance_version_by_id", &lua_get_instance_version_by_id),
luabind::def("get_instance_zone_id_by_id", &lua_get_instance_zone_id_by_id),
luabind::def("get_characters_in_instance", &lua_get_characters_in_instance),
luabind::def("assign_to_instance", &lua_assign_to_instance),
luabind::def("assign_to_instance_by_char_id", &lua_assign_to_instance_by_char_id),
+18 -4
View File
@@ -3030,6 +3030,20 @@ uint16 QuestManager::GetInstanceID(const char *zone, int16 version)
return 0;
}
std::vector<uint16> QuestManager::GetInstanceIDs(std::string zone_name, uint32 character_id)
{
if (!character_id) {
QuestManagerCurrentQuestVars();
if (initiator) {
return database.GetInstanceIDs(ZoneID(zone_name), initiator->CharacterID());
}
return { };
}
return database.GetInstanceIDs(ZoneID(zone_name), character_id);
}
uint16 QuestManager::GetInstanceIDByCharID(const char *zone, int16 version, uint32 char_id) {
return database.GetInstanceID(ZoneID(zone), char_id, version);
}
@@ -3092,7 +3106,7 @@ void QuestManager::RemoveFromInstanceByCharID(uint16 instance_id, uint32 char_id
}
bool QuestManager::CheckInstanceByCharID(uint16 instance_id, uint32 char_id) {
return database.CharacterInInstanceGroup(instance_id, char_id);
return database.CheckInstanceByCharID(instance_id, char_id);
}
void QuestManager::RemoveAllFromInstance(uint16 instance_id)
@@ -3100,14 +3114,14 @@ void QuestManager::RemoveAllFromInstance(uint16 instance_id)
QuestManagerCurrentQuestVars();
if (initiator)
{
std::list<uint32> charid_list;
std::list<uint32> character_ids;
if (database.RemoveClientsFromInstance(instance_id))
initiator->Message(Chat::Say, "Removed all players from instance.");
else
{
database.GetCharactersInInstance(instance_id, charid_list);
initiator->Message(Chat::Say, "Failed to remove %i player(s) from instance.", charid_list.size()); // once the expedition system is in, this message it not relevant
database.GetCharactersInInstance(instance_id, character_ids);
initiator->Message(Chat::Say, "Failed to remove %i player(s) from instance.", character_ids.size()); // once the expedition system is in, this message it not relevant
}
}
}
+1
View File
@@ -266,6 +266,7 @@ public:
uint32 GetInstanceTimerByID(uint16 instance_id = 0);
void DestroyInstance(uint16 instance_id);
uint16 GetInstanceID(const char *zone, int16 version);
std::vector<uint16> GetInstanceIDs(std::string zone_name, uint32 character_id = 0);
uint16 GetInstanceIDByCharID(const char *zone, int16 version, uint32 char_id);
void AssignToInstance(uint16 instance_id);
void AssignToInstanceByCharID(uint16 instance_id, uint32 char_id);
+2 -2
View File
@@ -545,11 +545,11 @@ void Client::MoveZoneRaid(const char *zone_short_name, const glm::vec4 &location
}
void Client::MoveZoneInstance(uint16 instance_id, const glm::vec4 &location) {
if (!database.CharacterInInstanceGroup(instance_id, CharacterID())) {
if (!database.CheckInstanceByCharID(instance_id, CharacterID())) {
database.AddClientToInstance(instance_id, CharacterID());
}
ProcessMovePC(database.ZoneIDFromInstanceID(instance_id), instance_id, location.x, location.y, location.z, location.w, 3, ZoneToSafeCoords);
ProcessMovePC(database.GetInstanceZoneID(instance_id), instance_id, location.x, location.y, location.z, location.w, 3, ZoneToSafeCoords);
}
void Client::MoveZoneInstanceGroup(uint16 instance_id, const glm::vec4 &location) {