[Quest API] Add SendToInstance(instance_type, zone_short_name, instance_version, x, y, z, heading, instance_identifier, duration) to Perl/Lua. (#1417)

* [Quest API] Add SendToInstance(instance_type, zone_short_name, instance_version, x, y, z, heading, instance_identifier, duration) to Perl/Lua.
- Add $client->SendToInstance(instance_type, zone_short_name, instance_version, x, y, z, heading, instance_identifier, duration) to Perl.
- Add client:SendToInstance(instance_type, zone_short_name, instance_version, x, y, z, heading, instance_identifier, duration) to Lua.

* Fix instance naming.

* Add current instance type to bucket name, remove unused variables.

* Typo.
This commit is contained in:
Alex 2021-06-17 12:49:20 -04:00 committed by GitHub
parent 3f8b67e500
commit ccfc8b296f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 79 additions and 0 deletions

View File

@ -10130,6 +10130,54 @@ void Client::SetAFK(uint8 afk_flag) {
safe_delete(outapp);
}
void Client::SendToInstance(std::string instance_type, std::string zone_short_name, uint32 instance_version, float x, float y, float z, float heading, std::string instance_identifier, uint32 duration) {
uint32 zone_id = ZoneID(zone_short_name);
std::string current_instance_type = str_tolower(instance_type);
std::string instance_type_name = "public";
if (current_instance_type.find("solo") != std::string::npos) {
instance_type_name = GetCleanName();
} else if (current_instance_type.find("group") != std::string::npos) {
uint32 group_id = (GetGroup() ? GetGroup()->GetID() : 0);
instance_type_name = itoa(group_id);
} else if (current_instance_type.find("raid") != std::string::npos) {
uint32 raid_id = (GetRaid() ? GetRaid()->GetID() : 0);
instance_type_name = itoa(raid_id);
} else if (current_instance_type.find("guild") != std::string::npos) {
uint32 guild_id = (GuildID() > 0 ? GuildID() : 0);
instance_type_name = itoa(guild_id);
}
std::string full_bucket_name = fmt::format(
"{}_{}_{}_{}",
current_instance_type,
instance_type_name,
instance_identifier,
zone_short_name
);
std::string current_bucket_value = DataBucket::GetData(full_bucket_name);
uint16 instance_id = 0;
if (current_bucket_value.length() > 0) {
instance_id = atoi(current_bucket_value.c_str());
} else {
if(!database.GetUnusedInstanceID(instance_id)) {
Message(Chat::White, "Server was unable to find a free instance id.");
return;
}
if(!database.CreateInstance(instance_id, zone_id, instance_version, duration)) {
Message(Chat::White, "Server was unable to create a new instance.");
return;
}
DataBucket::SetData(full_bucket_name, itoa(instance_id), itoa(duration));
}
AssignToInstance(instance_id);
MovePC(zone_id, instance_id, x, y, z, heading);
}
int Client::CountItem(uint32 item_id)
{
int quantity = 0;

View File

@ -662,6 +662,7 @@ public:
void MoveZoneInstanceGroup(uint16 instance_id);
void MoveZoneInstanceRaid(uint16 instance_id);
void SendToGuildHall();
void SendToInstance(std::string instance_type, std::string zone_short_name, uint32 instance_version, float x, float y, float z, float heading, std::string instance_identifier, uint32 duration);
void AssignToInstance(uint16 instance_id);
void RemoveFromInstance(uint16 instance_id);
void WhoAll();

View File

@ -2138,6 +2138,11 @@ void Lua_Client::ResetAllDisciplineTimers() {
self->ResetAllDisciplineTimers();
}
void Lua_Client::SendToInstance(std::string instance_type, std::string zone_short_name, uint32 instance_version, float x, float y, float z, float heading, std::string instance_identifier, uint32 duration) {
Lua_Safe_Call_Void();
self->SendToInstance(instance_type, zone_short_name, instance_version, x, y, z, heading, instance_identifier, duration);
}
int Lua_Client::CountItem(uint32 item_id) {
Lua_Safe_Call_Int();
return self->CountItem(item_id);
@ -2517,6 +2522,7 @@ luabind::scope lua_register_client() {
.def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32,uint32,const char*,const char*))& Lua_Client::Popup)
.def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32,uint32,const char*,const char*,uint32))&Lua_Client::Popup)
.def("ResetAllDisciplineTimers", (void(Lua_Client::*)(void))&Lua_Client::ResetAllDisciplineTimers)
.def("SendToInstance", (void(Lua_Client::*)(std::string,std::string,uint32,float,float,float,float,std::string,uint32))&Lua_Client::SendToInstance)
.def("CountItem", (int(Lua_Client::*)(uint32))&Lua_Client::CountItem)
.def("RemoveItem", (void(Lua_Client::*)(uint32))&Lua_Client::RemoveItem)
.def("RemoveItem", (void(Lua_Client::*)(uint32,uint32))&Lua_Client::RemoveItem);

View File

@ -41,6 +41,7 @@ public:
bool IsLD();
void WorldKick();
void SendToGuildHall();
void SendToInstance(std::string instance_type, std::string zone_short_name, uint32 instance_version, float x, float y, float z, float heading, std::string instance_identifier, uint32 duration);
int GetAnon();
void SetAnon(uint8 anon_flag);
int GetAFK();

View File

@ -5345,6 +5345,28 @@ XS(XS_Client_ResetAllDisciplineTimers) {
XSRETURN_EMPTY;
}
XS(XS_Client_SendToInstance);
XS(XS_Client_SendToInstance) {
dXSARGS;
if (items != 10)
Perl_croak(aTHX_ "Usage: Client::SendToInstance(THIS, std::string instance_type, std::string zone_short_name, uint32 instance_version, float x, float y, float z, float heading, std::string instance_identifier, uint32 duration)");
{
Client* THIS;
std::string instance_type = (std::string) SvPV_nolen(ST(1));
std::string zone_short_name = (std::string) SvPV_nolen(ST(2));
uint32 instance_version = (uint32) SvUV(ST(3));
float x = (float) SvNV(ST(4));
float y = (float) SvNV(ST(5));
float z = (float) SvNV(ST(6));
float heading = (float) SvNV(ST(7));
std::string instance_identifier = (std::string) SvPV_nolen(ST(8));
uint32 duration = (uint32) SvUV(ST(9));
VALIDATE_THIS_IS_CLIENT;
THIS->SendToInstance(instance_type, zone_short_name, instance_version, x, y, z, heading, instance_identifier, duration);
}
XSRETURN_EMPTY;
}
XS(XS_Client_CountItem);
XS(XS_Client_CountItem) {
dXSARGS;
@ -5616,6 +5638,7 @@ XS(boot_Client) {
newXSproto(strcpy(buf, "SendSound"), XS_Client_SendSound, file, "$");
newXSproto(strcpy(buf, "SendSpellAnim"), XS_Client_SendSpellAnim, file, "$$$");
newXSproto(strcpy(buf, "SendTargetCommand"), XS_Client_SendTargetCommand, file, "$$");
newXSproto(strcpy(buf, "SendToInstance"), XS_Client_SendToInstance, file, "$$$$$$$$$$");
newXSproto(strcpy(buf, "SendToGuildHall"), XS_Client_SendToGuildHall, file, "$");
newXSproto(strcpy(buf, "SendWebLink"), XS_Client_SendWebLink, file, "$:$");
newXSproto(strcpy(buf, "SendZoneFlagInfo"), XS_Client_SendZoneFlagInfo, file, "$$");