mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-13 15:08:22 +00:00
[Quest API] Add Goto Player Teleport Methods. (#2379)
* [Quest API] Add Player Teleport Methods. These methods will allow server operators to teleport players directly to other players via the quest API using the #goto command's functionality. - Add $client->TeleportToPlayerByCharID(character_id) to Perl. - Add $client->TeleportToPlayerByName(player_name) to Perl. - Add $client->TeleportGroupToPlayerByCharID(character_id) to Perl. - Add $client->TeleportGroupToPlayerByName(player_name) to Perl. - Add $client->TeleportRaidToPlayerByCharID(character_id) to Perl. - Add $client->TeleportRaidToPlayerByName(player_name) to Perl. - Add client:TeleportToPlayerByCharID(character_id) to Lua. - Add client:TeleportToPlayerByName(player_name) to Lua. - Add client:TeleportGroupToPlayerByCharID(character_id) to Lua. - Add client:TeleportGroupToPlayerByName(player_name) to Lua. - Add client:TeleportRaidToPlayerByCharID(character_id) to Lua. - Add client:TeleportRaidToPlayerByName(player_name) to Lua. * Simplify by using repositories * Simplify Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
+46
-31
@@ -65,6 +65,7 @@ extern volatile bool RunLoops;
|
||||
|
||||
#include "../common/repositories/character_spells_repository.h"
|
||||
#include "../common/repositories/character_disciplines_repository.h"
|
||||
#include "../common/repositories/character_data_repository.h"
|
||||
|
||||
|
||||
extern QueryServ* QServ;
|
||||
@@ -9373,44 +9374,22 @@ void Client::SetSecondaryWeaponOrnamentation(uint32 model_id)
|
||||
*/
|
||||
bool Client::GotoPlayer(std::string player_name)
|
||||
{
|
||||
std::string query = StringFormat(
|
||||
"SELECT"
|
||||
" character_data.zone_id,"
|
||||
" character_data.zone_instance,"
|
||||
" character_data.x,"
|
||||
" character_data.y,"
|
||||
" character_data.z,"
|
||||
" character_data.heading "
|
||||
"FROM"
|
||||
" character_data "
|
||||
"WHERE"
|
||||
" TRUE"
|
||||
" AND character_data.name = '%s'"
|
||||
" AND character_data.last_login > (UNIX_TIMESTAMP() - 600) LIMIT 1", player_name.c_str());
|
||||
auto characters = CharacterDataRepository::GetWhere(
|
||||
database,
|
||||
fmt::format("name = '{}' AND last_login > (UNIX_TIMESTAMP() - 600) LIMIT 1", player_name)
|
||||
);
|
||||
|
||||
auto results = database.QueryDatabase(query);
|
||||
if (!results.Success()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
auto zone_id = static_cast<uint32>(atoi(row[0]));
|
||||
auto instance_id = static_cast<uint16>(atoi(row[1]));
|
||||
auto x = static_cast<float>(atof(row[2]));
|
||||
auto y = static_cast<float>(atof(row[3]));
|
||||
auto z = static_cast<float>(atof(row[4]));
|
||||
auto heading = static_cast<float>(atof(row[5]));
|
||||
|
||||
if (instance_id > 0 && !database.CheckInstanceExists(instance_id)) {
|
||||
for (auto &c: characters) {
|
||||
if (c.zone_instance > 0 && !database.CheckInstanceExists(c.zone_instance)) {
|
||||
Message(Chat::Yellow, "Instance no longer exists...");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (instance_id > 0) {
|
||||
database.AddClientToInstance(instance_id, CharacterID());
|
||||
if (c.zone_instance > 0) {
|
||||
database.AddClientToInstance(c.zone_instance, CharacterID());
|
||||
}
|
||||
|
||||
MovePC(zone_id, instance_id, x, y, z, heading);
|
||||
MovePC(c.zone_id, c.zone_instance, c.x, c.y, c.z, c.heading);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -9418,6 +9397,42 @@ bool Client::GotoPlayer(std::string player_name)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Client::GotoPlayerGroup(const std::string& player_name)
|
||||
{
|
||||
if (!GetGroup()) {
|
||||
return GotoPlayer(player_name);
|
||||
}
|
||||
|
||||
for (auto &m: GetGroup()->members) {
|
||||
if (m && m->IsClient()) {
|
||||
auto c = m->CastToClient();
|
||||
if (!c->GotoPlayer(player_name)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Client::GotoPlayerRaid(const std::string& player_name)
|
||||
{
|
||||
if (!GetRaid()) {
|
||||
return GotoPlayer(player_name);
|
||||
}
|
||||
|
||||
for (auto &m: GetRaid()->members) {
|
||||
if (m.member && m.member->IsClient()) {
|
||||
auto c = m.member->CastToClient();
|
||||
if (!c->GotoPlayer(player_name)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
glm::vec4 &Client::GetLastPositionBeforeBulkUpdate()
|
||||
{
|
||||
return last_position_before_bulk_update;
|
||||
|
||||
Reference in New Issue
Block a user