From f2f0228aa41cb828a6089bc2ed58deee0093b5d8 Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Sun, 17 Sep 2023 14:16:25 -0400 Subject: [PATCH] [Quest API] Add XYZ/XYZH Overloads to Cross Zone Move Methods (#3581) # Perl - Add `quest::crosszonemoveplayerbycharid(character_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveplayerbycharid(character_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveplayerbygroupid(group_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveplayerbygroupid(group_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveplayerbyraidid(raid_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveplayerbyraidid(raid_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveplayerbyguildid(guild_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveplayerbyguildid(guild_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveplayerbyexpeditionid(expedition_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveplayerbyexpeditionid(expedition_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveplayerbyclientname(client_name, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveplayerbyclientname(client_name, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveinstancebycharid(character_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveinstancebycharid(character_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveinstancebygroupid(group_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveinstancebygroupid(group_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveinstancebyraidid(raid_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveinstancebyraidid(raid_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveinstancebyguildid(guild_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveinstancebyguildid(guild_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveinstancebyexpeditionid(expedition_id, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveinstancebyexpeditionid(expedition_id, zone_short_name, x, y, z, heading)`. - Add `quest::crosszonemoveinstancebyclientname(client_name, zone_short_name, x, y, z)`. - Add `quest::crosszonemoveinstancebyclientname(client_name, zone_short_name, x, y, z, heading)`. # Lua - Add `eq.cross_zone_move_player_by_char_id(character_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_player_by_char_id(character_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_player_by_group_id(group_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_player_by_group_id(group_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_player_by_raid_id(raid_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_player_by_raid_id(raid_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_player_by_guild_id(guild_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_player_by_guild_id(guild_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_player_by_expedition_id(expedition_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_player_by_expedition_id(expedition_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_player_by_client_name(client_name, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_player_by_client_name(client_name, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_instance_by_char_id(character_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_instance_by_char_id(character_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_instance_by_group_id(group_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_instance_by_group_id(group_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_instance_by_raid_id(raid_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_instance_by_raid_id(raid_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_instance_by_guild_id(guild_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_instance_by_guild_id(guild_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_instance_by_expedition_id(expedition_id, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_instance_by_expedition_id(expedition_id, zone_short_name, x, y, z, heading)`. - Add `eq.cross_zone_move_instance_by_client_name(client_name, zone_short_name, x, y, z)`. - Add `eq.cross_zone_move_instance_by_client_name(client_name, zone_short_name, x, y, z, heading)`. # Notes - Allows operators to send players to specific coordinates across zones instead of always sending to safe coordinates. --- common/servertalk.h | 137 +++++------ world/console.cpp | 19 +- zone/embparser_api.cpp | 532 +++++++++++++++++++++++++++++++++++++---- zone/lua_general.cpp | 504 ++++++++++++++++++++++++++++++++------ zone/questmgr.cpp | 26 +- zone/questmgr.h | 2 +- zone/worldserver.cpp | 109 +++++---- zone/zoning.cpp | 70 ++++-- 8 files changed, 1121 insertions(+), 278 deletions(-) diff --git a/common/servertalk.h b/common/servertalk.h index 36d730815..ce0427296 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -10,6 +10,7 @@ #include #include #include +#include #define SERVER_TIMEOUT 45000 // how often keepalive gets sent #define INTERSERVER_TIMER 10000 @@ -1486,95 +1487,96 @@ struct CZClientMessageString_Struct { struct CZDialogueWindow_Struct { uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name - int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name - char message[4096]; - char client_name[64]; // Only used by Character Name Type, else empty + int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name + char message[4096]; + char client_name[64]; // Only used by Character Name Type, else empty }; struct CZLDoNUpdate_Struct { - uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name - uint8 update_subtype; // 0 - Loss, 1 - Points, 2 - Win - int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name + uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name + uint8 update_subtype; // 0 - Loss, 1 - Points, 2 - Win + int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name uint32 theme_id; - int points; // Only used in Points Subtype, else 1 - char client_name[64]; // Only used by Character Name Type, else empty + int points; // Only used in Points Subtype, else 1 + char client_name[64]; // Only used by Character Name Type, else empty }; struct CZMarquee_Struct { - uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name - int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name + uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name + int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name uint32 type; uint32 priority; uint32 fade_in; uint32 fade_out; uint32 duration; - char message[512]; - char client_name[64]; // Only used by Character Name Type, else empty + char message[512]; + char client_name[64]; // Only used by Character Name Type, else empty }; struct CZMessage_Struct { - uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name - int update_identifier; // Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name + uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name + int update_identifier; // Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name uint32 type; - char message[512]; - char client_name[64]; // Only used by Character Name Type, else empty + char message[512]; + char client_name[64]; // Only used by Character Name Type, else empty }; struct CZMove_Struct { - uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name - uint8 update_subtype; // 0 - Move Zone, 1 - Move Zone Instance - int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name - uint16 instance_id; // Only used by Move Zone Instance, else 0 - char zone_short_name[32]; // Only by with Move Zone, else empty - char client_name[64]; // Only used by Character Name Type, else empty + std::string client_name = std::string(); // Only used by Character Name Type, else empty + glm::vec4 coordinates = glm::vec4(0.f); // XYZ or XYZH, heading is optional, defaults to 0. + uint16 instance_id = 0; // Only used by Move Zone Instance, else 0 + uint32 update_identifier = 0; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name + uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name + uint8 update_subtype; // 0 - Move Zone, 1 - Move Zone Instance + std::string zone_short_name = std::string(); // Only used by Move Zone, else empty }; struct CZSetEntityVariable_Struct { uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name, 6 - NPC - int update_identifier; // Group ID, Raid ID, Guild ID, Expedition ID, or NPC ID based on update type, 0 for Character Name - char variable_name[256]; - char variable_value[256]; - char client_name[64]; // Only used by Character Type, else empty + int update_identifier; // Group ID, Raid ID, Guild ID, Expedition ID, or NPC ID based on update type, 0 for Character Name + char variable_name[256]; + char variable_value[256]; + char client_name[64]; // Only used by Character Type, else empty }; struct CZSignal_Struct { uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name, 6 - NPC - int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, Expedition ID, or NPC ID based on update type, 0 for Character Name - int signal_id; - char client_name[64]; // Only used by Character Name Type, else empty + int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, Expedition ID, or NPC ID based on update type, 0 for Character Name + int signal_id; + char client_name[64]; // Only used by Character Name Type, else empty }; struct CZSpell_Struct { - uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name - uint8 update_subtype; // 0 - Cast Spell, 1 - Remove Spell - int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name + uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name + uint8 update_subtype; // 0 - Cast Spell, 1 - Remove Spell + int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name uint32 spell_id; - char client_name[64]; // Only used by Character Name Type, else empty + char client_name[64]; // Only used by Character Name Type, else empty }; struct CZTaskUpdate_Struct { - uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name - uint8 update_subtype; // 0 - Activity Reset, 1 - Activity Update, 2 - Assign Task, 3 - Disable Task, 4 - Enable Task, 5 - Fail Task, 6 - Remove Task - int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name + uint8 update_type; // 0 - Character, 1 - Group, 2 - Raid, 3 - Guild, 4 - Expedition, 5 - Character Name + uint8 update_subtype; // 0 - Activity Reset, 1 - Activity Update, 2 - Assign Task, 3 - Disable Task, 4 - Enable Task, 5 - Fail Task, 6 - Remove Task + int update_identifier; // Character ID, Group ID, Raid ID, Guild ID, or Expedition ID based on update type, 0 for Character Name uint32 task_identifier; - int task_subidentifier; // Activity ID for Activity Reset and Activity Update, NPC Entity ID for Assign Task, else -1 - int update_count; // Only used by Activity Update, else 1 - bool enforce_level_requirement; // Only used by Assign Task - char client_name[64]; // Only used by Character Name Type, else empty + int task_subidentifier; // Activity ID for Activity Reset and Activity Update, NPC Entity ID for Assign Task, else -1 + int update_count; // Only used by Activity Update, else 1 + bool enforce_level_requirement; // Only used by Assign Task + char client_name[64]; // Only used by Character Name Type, else empty }; struct WWDialogueWindow_Struct { - char message[4096]; + char message[4096]; uint8 min_status; uint8 max_status; }; struct WWLDoNUpdate_Struct { - uint8 update_type; // 0 - Loss, 1 - Points, 2 - Win + uint8 update_type; // 0 - Loss, 1 - Points, 2 - Win uint32 theme_id; - int points; // Only used in Points Subtype, else 1 - uint8 min_status; - uint8 max_status; + int points; // Only used in Points Subtype, else 1 + uint8 min_status; + uint8 max_status; }; struct WWMarquee_Struct { @@ -1583,56 +1585,57 @@ struct WWMarquee_Struct { uint32 fade_in; uint32 fade_out; uint32 duration; - char message[512]; - uint8 min_status; - uint8 max_status; + char message[512]; + uint8 min_status; + uint8 max_status; }; struct WWMessage_Struct { uint32 type; - char message[512]; - uint8 min_status; - uint8 max_status; + char message[512]; + uint8 min_status; + uint8 max_status; }; struct WWMove_Struct { - uint8 update_type; // 0 - Move Zone, 1 - Move Zone Instance - char zone_short_name[32]; // Used with Move Zone + uint8 update_type; // 0 - Move Zone, 1 - Move Zone Instance + char zone_short_name[32]; // Used with Move Zone uint16 instance_id; // Used with Move Zone Instance - uint8 min_status; - uint8 max_status; + uint8 min_status; + uint8 max_status; }; + struct WWSetEntityVariable_Struct { uint8 update_type; // 0 - Character, 1 - NPC - char variable_name[256]; - char variable_value[256]; + char variable_name[256]; + char variable_value[256]; uint8 min_status; uint8 max_status; }; struct WWSignal_Struct { uint8 update_type; // 0 - Character, 1 - NPC - int signal_id; + int signal_id; uint8 min_status; uint8 max_status; }; struct WWSpell_Struct { - uint8 update_type; // 0 - Cast Spell, 1 - Remove Spell + uint8 update_type; // 0 - Cast Spell, 1 - Remove Spell uint32 spell_id; - uint8 min_status; - uint8 max_status; + uint8 min_status; + uint8 max_status; }; struct WWTaskUpdate_Struct { - uint8 update_type; // 0 - Activity Reset, 1 - Activity Update, 2 - Assign Task, 3 - Disable Task, 4 - Enable Task, 5 - Fail Task, 6 - Remove Task + uint8 update_type; // 0 - Activity Reset, 1 - Activity Update, 2 - Assign Task, 3 - Disable Task, 4 - Enable Task, 5 - Fail Task, 6 - Remove Task uint32 task_identifier; - int task_subidentifier; // Activity ID for Activity Reset and Activity Update, NPC Entity ID for Assign Task, else -1 - int update_count; // Update Count for Activity Update, else 1 - bool enforce_level_requirement; // Only used by Assign Task, else false - uint8 min_status; - uint8 max_status; + int task_subidentifier; // Activity ID for Activity Reset and Activity Update, NPC Entity ID for Assign Task, else -1 + int update_count; // Update Count for Activity Update, else 1 + bool enforce_level_requirement; // Only used by Assign Task, else false + uint8 min_status; + uint8 max_status; }; struct ReloadWorld_Struct { diff --git a/world/console.cpp b/world/console.cpp index 43fa55c63..70356d7a5 100644 --- a/world/console.cpp +++ b/world/console.cpp @@ -1226,15 +1226,20 @@ void ConsoleCrossZoneMove( } auto pack = new ServerPacket(ServerOP_CZMove, sizeof(CZMove_Struct)); - auto* CZM = (CZMove_Struct*) pack->pBuffer; + auto m = (CZMove_Struct*) pack->pBuffer; - CZM->update_type = update_type; - CZM->update_subtype = !instance_id ? CZMoveUpdateSubtype_MoveZone : CZMoveUpdateSubtype_MoveZoneInstance; - CZM->update_identifier = update_identifier; - CZM->instance_id = instance_id; + if (!name.empty()) { + m->client_name = name; + } - strn0cpy(CZM->zone_short_name, zone_short_name.c_str(), sizeof(CZM->zone_short_name)); - strn0cpy(CZM->client_name, name.c_str(), sizeof(CZM->client_name)); + m->instance_id = instance_id; + m->update_identifier = update_identifier; + m->update_type = update_type; + m->update_subtype = !instance_id ? CZMoveUpdateSubtype_MoveZone : CZMoveUpdateSubtype_MoveZoneInstance; + + if (!zone_short_name.empty()) { + m->zone_short_name = zone_short_name; + } zoneserver_list.SendPacket(pack); safe_delete(pack); diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index 5c9c6ec2f..424cc53c6 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -3481,78 +3481,488 @@ void Perl__crosszonemessageplayerbyname(const char* client_name, uint32 type, co quest_manager.CrossZoneMessage(CZUpdateType_ClientName, update_identifier, type, message, client_name); } -void Perl__crosszonemoveplayerbycharid(int character_id, const char* zone_short_name) +void Perl__crosszonemoveplayerbycharid(uint32 character_id, std::string zone_short_name) { - uint16 instance_id = 0; - quest_manager.CrossZoneMove(CZUpdateType_Character, CZMoveUpdateSubtype_MoveZone, character_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveplayerbygroupid(int group_id, const char* zone_short_name) +void Perl__crosszonemoveplayerbycharid(uint32 character_id, std::string zone_short_name, float x, float y, float z) { - uint16 instance_id = 0; - quest_manager.CrossZoneMove(CZUpdateType_Group, CZMoveUpdateSubtype_MoveZone, group_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveplayerbyraidid(int raid_id, const char* zone_short_name) +void Perl__crosszonemoveplayerbycharid( + uint32 character_id, + std::string zone_short_name, + float x, + float y, + float z, + float heading +) { - uint16 instance_id = 0; - quest_manager.CrossZoneMove(CZUpdateType_Raid, CZMoveUpdateSubtype_MoveZone, raid_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveplayerbyguildid(int guild_id, const char* zone_short_name) +void Perl__crosszonemoveplayerbygroupid(uint32 group_id, std::string zone_short_name) { - uint16 instance_id = 0; - quest_manager.CrossZoneMove(CZUpdateType_Guild, CZMoveUpdateSubtype_MoveZone, guild_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveplayerbyexpeditionid(uint32 expedition_id, const char* zone_short_name) +void Perl__crosszonemoveplayerbygroupid(uint32 group_id, std::string zone_short_name, float x, float y, float z) { - uint16 instance_id = 0; - quest_manager.CrossZoneMove(CZUpdateType_Expedition, CZMoveUpdateSubtype_MoveZone, expedition_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveplayerbyname(const char* client_name, const char* zone_short_name) +void Perl__crosszonemoveplayerbygroupid( + uint32 group_id, + std::string zone_short_name, + float x, + float y, + float z, + float heading +) { - int update_identifier = 0; - uint16 instance_id = 0; - quest_manager.CrossZoneMove(CZUpdateType_ClientName, CZMoveUpdateSubtype_MoveZone, update_identifier, zone_short_name, instance_id, client_name); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveinstancebycharid(int character_id, uint16 instance_id) +void Perl__crosszonemoveplayerbyraidid(uint32 raid_id, std::string zone_short_name) { - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(CZUpdateType_Character, CZMoveUpdateSubtype_MoveZoneInstance, character_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveinstancebygroupid(int group_id, uint16 instance_id) +void Perl__crosszonemoveplayerbyraidid(uint32 raid_id, std::string zone_short_name, float x, float y, float z) { - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(CZUpdateType_Group, CZMoveUpdateSubtype_MoveZoneInstance, group_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveinstancebyraidid(int raid_id, uint16 instance_id) +void Perl__crosszonemoveplayerbyraidid(uint32 raid_id, std::string zone_short_name, float x, float y, float z, float heading) { - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(CZUpdateType_Raid, CZMoveUpdateSubtype_MoveZoneInstance, raid_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void Perl__crosszonemoveinstancebyguildid(int guild_id, uint16 instance_id) +void Perl__crosszonemoveplayerbyguildid(uint32 guild_id, std::string zone_short_name) { - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(CZUpdateType_Guild, CZMoveUpdateSubtype_MoveZoneInstance, guild_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyguildid(uint32 guild_id, std::string zone_short_name, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyguildid( + uint32 guild_id, + std::string zone_short_name, + float x, + float y, + float z, + float heading +) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyexpeditionid(uint32 expedition_id, std::string zone_short_name) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyexpeditionid(uint32 expedition_id, std::string zone_short_name, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyexpeditionid( + uint32 expedition_id, + std::string zone_short_name, + float x, + float y, + float z, + float heading +) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyname(std::string client_name, std::string zone_short_name) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyname(std::string client_name, std::string zone_short_name, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveplayerbyname(std::string client_name, std::string zone_short_name, float x, float y, float z, float heading) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, heading), + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void Perl__crosszonemoveinstancebycharid(uint32 character_id, uint16 instance_id) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebycharid(uint32 character_id, uint16 instance_id, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebycharid(uint32 character_id, uint16 instance_id, float x, float y, float z, float heading) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebygroupid(uint32 group_id, uint16 instance_id) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebygroupid(uint32 group_id, uint16 instance_id, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebygroupid(uint32 group_id, uint16 instance_id, float x, float y, float z, float heading) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyraidid(uint32 raid_id, uint16 instance_id) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyraidid(uint32 raid_id, uint16 instance_id, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyraidid(uint32 raid_id, uint16 instance_id, float x, float y, float z, float heading) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyguildid(uint32 guild_id, uint16 instance_id) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyguildid(uint32 guild_id, uint16 instance_id, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyguildid(uint32 guild_id, uint16 instance_id, float x, float y, float z, float heading) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); } void Perl__crosszonemoveinstancebyexpeditionid(uint32 expedition_id, uint16 instance_id) { - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(CZUpdateType_Expedition, CZMoveUpdateSubtype_MoveZoneInstance, expedition_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); } -void Perl__crosszonemoveinstancebyclientname(const char* client_name, uint16 instance_id) +void Perl__crosszonemoveinstancebyexpeditionid(uint32 expedition_id, uint16 instance_id, float x, float y, float z) { - int update_identifier = 0; - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(CZUpdateType_ClientName, CZMoveUpdateSubtype_MoveZoneInstance, update_identifier, zone_short_name, instance_id, client_name); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyexpeditionid(uint32 expedition_id, uint16 instance_id, float x, float y, float z, float heading) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyclientname(std::string client_name, uint16 instance_id) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .instance_id = instance_id, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyclientname(std::string client_name, uint16 instance_id, float x, float y, float z) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void Perl__crosszonemoveinstancebyclientname(std::string client_name, uint16 instance_id, float x, float y, float z, float heading) +{ + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); } void Perl__crosszoneremoveldonlossbycharid(int character_id, uint32 theme_id) @@ -5762,18 +6172,42 @@ void perl_register_quest() package.add("crosszonemessageplayerbyguildid", &Perl__crosszonemessageplayerbyguildid); package.add("crosszonemessageplayerbyexpeditionid", &Perl__crosszonemessageplayerbyexpeditionid); package.add("crosszonemessageplayerbyname", &Perl__crosszonemessageplayerbyname); - package.add("crosszonemoveplayerbycharid", &Perl__crosszonemoveplayerbycharid); - package.add("crosszonemoveplayerbygroupid", &Perl__crosszonemoveplayerbygroupid); - package.add("crosszonemoveplayerbyraidid", &Perl__crosszonemoveplayerbyraidid); - package.add("crosszonemoveplayerbyguildid", &Perl__crosszonemoveplayerbyguildid); - package.add("crosszonemoveplayerbyexpeditionid", &Perl__crosszonemoveplayerbyexpeditionid); - package.add("crosszonemoveplayerbyname", &Perl__crosszonemoveplayerbyname); - package.add("crosszonemoveinstancebycharid", &Perl__crosszonemoveinstancebycharid); - package.add("crosszonemoveinstancebygroupid", &Perl__crosszonemoveinstancebygroupid); - package.add("crosszonemoveinstancebyraidid", &Perl__crosszonemoveinstancebyraidid); - package.add("crosszonemoveinstancebyguildid", &Perl__crosszonemoveinstancebyguildid); - package.add("crosszonemoveinstancebyexpeditionid", &Perl__crosszonemoveinstancebyexpeditionid); - package.add("crosszonemoveinstancebyclientname", &Perl__crosszonemoveinstancebyclientname); + package.add("crosszonemoveplayerbycharid", (void(*)(uint32, std::string))&Perl__crosszonemoveplayerbycharid); + package.add("crosszonemoveplayerbycharid", (void(*)(uint32, std::string, float, float, float))&Perl__crosszonemoveplayerbycharid); + package.add("crosszonemoveplayerbycharid", (void(*)(uint32, std::string, float, float, float, float))&Perl__crosszonemoveplayerbycharid); + package.add("crosszonemoveplayerbygroupid", (void(*)(uint32, std::string))&Perl__crosszonemoveplayerbygroupid); + package.add("crosszonemoveplayerbygroupid", (void(*)(uint32, std::string, float, float, float))&Perl__crosszonemoveplayerbygroupid); + package.add("crosszonemoveplayerbygroupid", (void(*)(uint32, std::string, float, float, float, float))&Perl__crosszonemoveplayerbygroupid); + package.add("crosszonemoveplayerbyraidid", (void(*)(uint32, std::string))&Perl__crosszonemoveplayerbyraidid); + package.add("crosszonemoveplayerbyraidid", (void(*)(uint32, std::string, float, float, float))&Perl__crosszonemoveplayerbyraidid); + package.add("crosszonemoveplayerbyraidid", (void(*)(uint32, std::string, float, float, float, float))&Perl__crosszonemoveplayerbyraidid); + package.add("crosszonemoveplayerbyguildid", (void(*)(uint32, std::string))&Perl__crosszonemoveplayerbyguildid); + package.add("crosszonemoveplayerbyguildid", (void(*)(uint32, std::string, float, float, float))&Perl__crosszonemoveplayerbyguildid); + package.add("crosszonemoveplayerbyguildid", (void(*)(uint32, std::string, float, float, float, float))&Perl__crosszonemoveplayerbyguildid); + package.add("crosszonemoveplayerbyexpeditionid", (void(*)(uint32, std::string))&Perl__crosszonemoveplayerbyexpeditionid); + package.add("crosszonemoveplayerbyexpeditionid", (void(*)(uint32, std::string, float, float, float))&Perl__crosszonemoveplayerbyexpeditionid); + package.add("crosszonemoveplayerbyexpeditionid", (void(*)(uint32, std::string, float, float, float, float))&Perl__crosszonemoveplayerbyexpeditionid); + package.add("crosszonemoveplayerbyname", (void(*)(std::string, std::string))&Perl__crosszonemoveplayerbyname); + package.add("crosszonemoveplayerbyname", (void(*)(std::string, std::string, float, float, float))&Perl__crosszonemoveplayerbyname); + package.add("crosszonemoveplayerbyname", (void(*)(std::string, std::string, float, float, float, float))&Perl__crosszonemoveplayerbyname); + package.add("crosszonemoveinstancebycharid", (void(*)(uint32, uint16))&Perl__crosszonemoveinstancebycharid); + package.add("crosszonemoveinstancebycharid", (void(*)(uint32, uint16, float, float, float))&Perl__crosszonemoveinstancebycharid); + package.add("crosszonemoveinstancebycharid", (void(*)(uint32, uint16, float, float, float, float))&Perl__crosszonemoveinstancebycharid); + package.add("crosszonemoveinstancebygroupid", (void(*)(uint32, uint16))&Perl__crosszonemoveinstancebygroupid); + package.add("crosszonemoveinstancebygroupid", (void(*)(uint32, uint16, float, float, float))&Perl__crosszonemoveinstancebygroupid); + package.add("crosszonemoveinstancebygroupid", (void(*)(uint32, uint16, float, float, float, float))&Perl__crosszonemoveinstancebygroupid); + package.add("crosszonemoveinstancebyraidid", (void(*)(uint32, uint16))&Perl__crosszonemoveinstancebyraidid); + package.add("crosszonemoveinstancebyraidid", (void(*)(uint32, uint16, float, float, float))&Perl__crosszonemoveinstancebyraidid); + package.add("crosszonemoveinstancebyraidid", (void(*)(uint32, uint16, float, float, float, float))&Perl__crosszonemoveinstancebyraidid); + package.add("crosszonemoveinstancebyguildid", (void(*)(uint32, uint16))&Perl__crosszonemoveinstancebyguildid); + package.add("crosszonemoveinstancebyguildid", (void(*)(uint32, uint16, float, float, float))&Perl__crosszonemoveinstancebyguildid); + package.add("crosszonemoveinstancebyguildid", (void(*)(uint32, uint16, float, float, float, float))&Perl__crosszonemoveinstancebyguildid); + package.add("crosszonemoveinstancebyexpeditionid", (void(*)(uint32, uint16))&Perl__crosszonemoveinstancebyexpeditionid); + package.add("crosszonemoveinstancebyexpeditionid", (void(*)(uint32, uint16, float, float, float))&Perl__crosszonemoveinstancebyexpeditionid); + package.add("crosszonemoveinstancebyexpeditionid", (void(*)(uint32, uint16, float, float, float, float))&Perl__crosszonemoveinstancebyexpeditionid); + package.add("crosszonemoveinstancebyclientname", (void(*)(std::string, uint16))&Perl__crosszonemoveinstancebyclientname); + package.add("crosszonemoveinstancebyclientname", (void(*)(std::string, uint16, float, float, float))&Perl__crosszonemoveinstancebyclientname); + package.add("crosszonemoveinstancebyclientname", (void(*)(std::string, uint16, float, float, float, float))&Perl__crosszonemoveinstancebyclientname); package.add("crosszoneremoveldonlossbycharid", &Perl__crosszoneremoveldonlossbycharid); package.add("crosszoneremoveldonlossbygroupid", &Perl__crosszoneremoveldonlossbygroupid); package.add("crosszoneremoveldonlossbyraidid", &Perl__crosszoneremoveldonlossbyraidid); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index d0b2d64a6..f6081db8c 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -2539,90 +2539,424 @@ void lua_cross_zone_message_player_by_name(uint32 type, const char* client_name, quest_manager.CrossZoneMessage(update_type, update_identifier, type, message, client_name); } -void lua_cross_zone_move_player_by_char_id(int character_id, const char* zone_short_name) { - uint8 update_type = CZUpdateType_Character; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZone; - uint16 instance_id = 0; - quest_manager.CrossZoneMove(update_type, update_subtype, character_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_char_id(uint32 character_id, std::string zone_short_name) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_player_by_group_id(int group_id, const char* zone_short_name) { - uint8 update_type = CZUpdateType_Group; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZone; - uint16 instance_id = 0; - quest_manager.CrossZoneMove(update_type, update_subtype, group_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_char_id(uint32 character_id, std::string zone_short_name, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_player_by_raid_id(int raid_id, const char* zone_short_name) { - uint8 update_type = CZUpdateType_Raid; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZone; - uint16 instance_id = 0; - quest_manager.CrossZoneMove(update_type, update_subtype, raid_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_char_id(uint32 character_id, std::string zone_short_name, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_player_by_guild_id(int guild_id, const char* zone_short_name) { - uint8 update_type = CZUpdateType_Guild; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZone; - uint16 instance_id = 0; - quest_manager.CrossZoneMove(update_type, update_subtype, guild_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_group_id(uint32 group_id, std::string zone_short_name) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_player_by_expedition_id(int expedition_id, const char* zone_short_name) { - uint8 update_type = CZUpdateType_Expedition; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZone; - uint16 instance_id = 0; - quest_manager.CrossZoneMove(update_type, update_subtype, expedition_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_group_id(uint32 group_id, std::string zone_short_name, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_player_by_client_name(const char* client_name, const char* zone_short_name) { - uint8 update_type = CZUpdateType_Character; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZone; - int update_identifier = 0; - uint16 instance_id = 0; - quest_manager.CrossZoneMove(update_type, update_subtype, update_identifier, zone_short_name, instance_id, client_name); +void lua_cross_zone_move_player_by_group_id(uint32 group_id, std::string zone_short_name, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_instance_by_char_id(int character_id, uint16 instance_id) { - uint8 update_type = CZUpdateType_Character; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZoneInstance; - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(update_type, update_subtype, character_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_raid_id(uint32 raid_id, std::string zone_short_name) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_instance_by_group_id(int group_id, uint16 instance_id) { - uint8 update_type = CZUpdateType_Group; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZoneInstance; - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(update_type, update_subtype, group_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_raid_id(uint32 raid_id, std::string zone_short_name, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_instance_by_raid_id(int raid_id, uint16 instance_id) { - uint8 update_type = CZUpdateType_Raid; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZoneInstance; - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(update_type, update_subtype, raid_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_raid_id(uint32 raid_id, std::string zone_short_name, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); } -void lua_cross_zone_move_instance_by_guild_id(int guild_id, uint16 instance_id) { - uint8 update_type = CZUpdateType_Guild; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZoneInstance; - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(update_type, update_subtype, guild_id, zone_short_name, instance_id); +void lua_cross_zone_move_player_by_guild_id(uint32 guild_id, std::string zone_short_name) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_guild_id(uint32 guild_id, std::string zone_short_name, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_guild_id(uint32 guild_id, std::string zone_short_name, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_expedition_id(uint32 expedition_id, std::string zone_short_name) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_expedition_id(uint32 expedition_id, std::string zone_short_name, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_expedition_id(uint32 expedition_id, std::string zone_short_name, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_client_name(std::string client_name, std::string zone_short_name) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_client_name(std::string client_name, std::string zone_short_name, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, 0.0f), + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_player_by_client_name(std::string client_name, std::string zone_short_name, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, heading), + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZone, + .zone_short_name = zone_short_name, + } + ); +} + +void lua_cross_zone_move_instance_by_char_id(uint32 character_id, uint16 instance_id) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_char_id(uint32 character_id, uint16 instance_id, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_char_id(uint32 character_id, uint16 instance_id, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = character_id, + .update_type = CZUpdateType_Character, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_group_id(uint32 group_id, uint16 instance_id) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_group_id(uint32 group_id, uint16 instance_id, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_group_id(uint32 group_id, uint16 instance_id, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = group_id, + .update_type = CZUpdateType_Group, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_raid_id(uint32 raid_id, uint16 instance_id) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_raid_id(uint32 raid_id, uint16 instance_id, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_raid_id(uint32 raid_id, uint16 instance_id, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = raid_id, + .update_type = CZUpdateType_Raid, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_guild_id(uint32 guild_id, uint16 instance_id) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_guild_id(uint32 guild_id, uint16 instance_id, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_guild_id(uint32 guild_id, uint16 instance_id, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = guild_id, + .update_type = CZUpdateType_Guild, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); } void lua_cross_zone_move_instance_by_expedition_id(uint32 expedition_id, uint16 instance_id) { - uint8 update_type = CZUpdateType_Expedition; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZoneInstance; - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(update_type, update_subtype, expedition_id, zone_short_name, instance_id); + quest_manager.CrossZoneMove( + CZMove_Struct{ + .instance_id = instance_id, + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); } -void lua_cross_zone_move_instance_by_client_name(const char* client_name, uint16 instance_id) { - uint8 update_type = CZUpdateType_ClientName; - uint8 update_subtype = CZMoveUpdateSubtype_MoveZoneInstance; - int update_identifier = 0; - const char* zone_short_name = ""; - quest_manager.CrossZoneMove(update_type, update_subtype, update_identifier, zone_short_name, instance_id, client_name); +void lua_cross_zone_move_instance_by_expedition_id(uint32 expedition_id, uint16 instance_id, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_expedition_id(uint32 expedition_id, uint16 instance_id, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_identifier = expedition_id, + .update_type = CZUpdateType_Expedition, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_client_name(std::string client_name, uint16 instance_id) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .instance_id = instance_id, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_client_name(std::string client_name, uint16 instance_id, float x, float y, float z) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, 0.0f), + .instance_id = instance_id, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); +} + +void lua_cross_zone_move_instance_by_client_name(std::string client_name, uint16 instance_id, float x, float y, float z, float heading) { + quest_manager.CrossZoneMove( + CZMove_Struct{ + .client_name = client_name, + .coordinates = glm::vec4(x, y, z, heading), + .instance_id = instance_id, + .update_type = CZUpdateType_ClientName, + .update_subtype = CZMoveUpdateSubtype_MoveZoneInstance, + } + ); } void lua_cross_zone_remove_ldon_loss_by_char_id(int character_id, uint32 theme_id) { @@ -5890,18 +6224,42 @@ luabind::scope lua_register_general() { luabind::def("cross_zone_message_player_by_guild_id", &lua_cross_zone_message_player_by_guild_id), luabind::def("cross_zone_message_player_by_expedition_id", &lua_cross_zone_message_player_by_expedition_id), luabind::def("cross_zone_message_player_by_name", &lua_cross_zone_message_player_by_name), - luabind::def("cross_zone_move_player_by_char_id", &lua_cross_zone_move_player_by_char_id), - luabind::def("cross_zone_move_player_by_group_id", &lua_cross_zone_move_player_by_group_id), - luabind::def("cross_zone_move_player_by_raid_id", &lua_cross_zone_move_player_by_raid_id), - luabind::def("cross_zone_move_player_by_guild_id", &lua_cross_zone_move_player_by_guild_id), - luabind::def("cross_zone_move_player_by_expedition_id", &lua_cross_zone_move_player_by_expedition_id), - luabind::def("cross_zone_move_player_by_client_name", &lua_cross_zone_move_player_by_client_name), - luabind::def("cross_zone_move_instance_by_char_id", &lua_cross_zone_move_instance_by_char_id), - luabind::def("cross_zone_move_instance_by_group_id", &lua_cross_zone_move_instance_by_group_id), - luabind::def("cross_zone_move_instance_by_raid_id", &lua_cross_zone_move_instance_by_raid_id), - luabind::def("cross_zone_move_instance_by_guild_id", &lua_cross_zone_move_instance_by_guild_id), - luabind::def("cross_zone_move_instance_by_expedition_id", &lua_cross_zone_move_instance_by_expedition_id), - luabind::def("cross_zone_move_instance_by_client_name", &lua_cross_zone_move_instance_by_client_name), + luabind::def("cross_zone_move_player_by_char_id", (void(*)(uint32,std::string))&lua_cross_zone_move_player_by_char_id), + luabind::def("cross_zone_move_player_by_char_id", (void(*)(uint32,std::string,float,float,float))&lua_cross_zone_move_player_by_char_id), + luabind::def("cross_zone_move_player_by_char_id", (void(*)(uint32,std::string,float,float,float,float))&lua_cross_zone_move_player_by_char_id), + luabind::def("cross_zone_move_player_by_group_id", (void(*)(uint32,std::string))&lua_cross_zone_move_player_by_group_id), + luabind::def("cross_zone_move_player_by_group_id", (void(*)(uint32,std::string,float,float,float))&lua_cross_zone_move_player_by_group_id), + luabind::def("cross_zone_move_player_by_group_id", (void(*)(uint32,std::string,float,float,float,float))&lua_cross_zone_move_player_by_group_id), + luabind::def("cross_zone_move_player_by_raid_id", (void(*)(uint32,std::string))&lua_cross_zone_move_player_by_raid_id), + luabind::def("cross_zone_move_player_by_raid_id", (void(*)(uint32,std::string,float,float,float))&lua_cross_zone_move_player_by_raid_id), + luabind::def("cross_zone_move_player_by_raid_id", (void(*)(uint32,std::string,float,float,float,float))&lua_cross_zone_move_player_by_raid_id), + luabind::def("cross_zone_move_player_by_guild_id", (void(*)(uint32,std::string))&lua_cross_zone_move_player_by_guild_id), + luabind::def("cross_zone_move_player_by_guild_id", (void(*)(uint32,std::string,float,float,float))&lua_cross_zone_move_player_by_guild_id), + luabind::def("cross_zone_move_player_by_guild_id", (void(*)(uint32,std::string,float,float,float,float))&lua_cross_zone_move_player_by_guild_id), + luabind::def("cross_zone_move_player_by_expedition_id", (void(*)(uint32,std::string))&lua_cross_zone_move_player_by_expedition_id), + luabind::def("cross_zone_move_player_by_expedition_id", (void(*)(uint32,std::string,float,float,float))&lua_cross_zone_move_player_by_expedition_id), + luabind::def("cross_zone_move_player_by_expedition_id", (void(*)(uint32,std::string,float,float,float,float))&lua_cross_zone_move_player_by_expedition_id), + luabind::def("cross_zone_move_player_by_client_name", (void(*)(std::string,std::string))&lua_cross_zone_move_player_by_client_name), + luabind::def("cross_zone_move_player_by_client_name", (void(*)(std::string,std::string,float,float,float))&lua_cross_zone_move_player_by_client_name), + luabind::def("cross_zone_move_player_by_client_name", (void(*)(std::string,std::string,float,float,float,float))&lua_cross_zone_move_player_by_client_name), + luabind::def("cross_zone_move_instance_by_char_id", (void(*)(uint32,uint16))&lua_cross_zone_move_instance_by_char_id), + luabind::def("cross_zone_move_instance_by_char_id", (void(*)(uint32,uint16,float,float,float))&lua_cross_zone_move_instance_by_char_id), + luabind::def("cross_zone_move_instance_by_char_id", (void(*)(uint32,uint16,float,float,float,float))&lua_cross_zone_move_instance_by_char_id), + luabind::def("cross_zone_move_instance_by_group_id", (void(*)(uint32,uint16))&lua_cross_zone_move_instance_by_group_id), + luabind::def("cross_zone_move_instance_by_group_id", (void(*)(uint32,uint16,float,float,float))&lua_cross_zone_move_instance_by_group_id), + luabind::def("cross_zone_move_instance_by_group_id", (void(*)(uint32,uint16,float,float,float,float))&lua_cross_zone_move_instance_by_group_id), + luabind::def("cross_zone_move_instance_by_raid_id", (void(*)(uint32,uint16))&lua_cross_zone_move_instance_by_raid_id), + luabind::def("cross_zone_move_instance_by_raid_id", (void(*)(uint32,uint16,float,float,float))&lua_cross_zone_move_instance_by_raid_id), + luabind::def("cross_zone_move_instance_by_raid_id", (void(*)(uint32,uint16,float,float,float,float))&lua_cross_zone_move_instance_by_raid_id), + luabind::def("cross_zone_move_instance_by_guild_id", (void(*)(uint32,uint16))&lua_cross_zone_move_instance_by_guild_id), + luabind::def("cross_zone_move_instance_by_guild_id", (void(*)(uint32,uint16,float,float,float))&lua_cross_zone_move_instance_by_guild_id), + luabind::def("cross_zone_move_instance_by_guild_id", (void(*)(uint32,uint16,float,float,float,float))&lua_cross_zone_move_instance_by_guild_id), + luabind::def("cross_zone_move_instance_by_expedition_id", (void(*)(uint32,uint16))&lua_cross_zone_move_instance_by_expedition_id), + luabind::def("cross_zone_move_instance_by_expedition_id", (void(*)(uint32,uint16,float,float,float))&lua_cross_zone_move_instance_by_expedition_id), + luabind::def("cross_zone_move_instance_by_expedition_id", (void(*)(uint32,uint16,float,float,float,float))&lua_cross_zone_move_instance_by_expedition_id), + luabind::def("cross_zone_move_instance_by_client_name", (void(*)(std::string,uint16))&lua_cross_zone_move_instance_by_client_name), + luabind::def("cross_zone_move_instance_by_client_name", (void(*)(std::string,uint16,float,float,float))&lua_cross_zone_move_instance_by_client_name), + luabind::def("cross_zone_move_instance_by_client_name", (void(*)(std::string,uint16,float,float,float,float))&lua_cross_zone_move_instance_by_client_name), luabind::def("cross_zone_remove_ldon_loss_by_char_id", &lua_cross_zone_remove_ldon_loss_by_char_id), luabind::def("cross_zone_remove_ldon_loss_by_group_id", &lua_cross_zone_remove_ldon_loss_by_group_id), luabind::def("cross_zone_remove_ldon_loss_by_raid_id", &lua_cross_zone_remove_ldon_loss_by_raid_id), diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index ff86f1c5f..06bd4bb93 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -3980,15 +3980,25 @@ void QuestManager::CrossZoneMessage(uint8 update_type, int update_identifier, ui safe_delete(pack); } -void QuestManager::CrossZoneMove(uint8 update_type, uint8 update_subtype, int update_identifier, const char* zone_short_name, uint16 instance_id, const char* client_name) { +void QuestManager::CrossZoneMove(const CZMove_Struct& m) +{ auto pack = new ServerPacket(ServerOP_CZMove, sizeof(CZMove_Struct)); - CZMove_Struct* CZM = (CZMove_Struct*)pack->pBuffer; - CZM->update_type = update_type; - CZM->update_subtype = update_subtype; - CZM->update_identifier = update_identifier; - strn0cpy(CZM->zone_short_name, zone_short_name, 32); - CZM->instance_id = instance_id; - strn0cpy(CZM->client_name, client_name, 64); + auto s = (CZMove_Struct*) pack->pBuffer; + + if (!m.client_name.empty()) { + s->client_name = m.client_name; + } + + s->coordinates = m.coordinates; + s->instance_id = m.instance_id; + s->update_type = m.update_type; + s->update_subtype = m.update_subtype; + s->update_identifier = m.update_identifier; + + if (!m.zone_short_name.empty()) { + s->zone_short_name = m.zone_short_name; + } + worldserver.SendPacket(pack); safe_delete(pack); } diff --git a/zone/questmgr.h b/zone/questmgr.h index ba03d5730..249da3320 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -312,7 +312,7 @@ public: void CrossZoneLDoNUpdate(uint8 update_type, uint8 update_subtype, int update_identifier, uint32 theme_id, int points = 1, const char* client_name = ""); void CrossZoneMarquee(uint8 update_type, int update_identifier, uint32 type, uint32 priority, uint32 fade_in, uint32 fade_out, uint32 duration, const char* message, const char* client_name = ""); void CrossZoneMessage(uint8 update_type, int update_identifier, uint32 type, const char* message, const char* client_name = ""); - void CrossZoneMove(uint8 update_type, uint8 update_subtype, int update_identifier, const char* zone_short_name, uint16 instance_id, const char* client_name = ""); + void CrossZoneMove(const CZMove_Struct& m); void CrossZoneSetEntityVariable(uint8 update_type, int update_identifier, const char* variable_name, const char* variable_value, const char* client_name = ""); void CrossZoneSignal(uint8 update_type, int update_identifier, int signal_id, const char* client_name = ""); void CrossZoneSpell(uint8 update_type, uint8 update_subtype, int update_identifier, uint32 spell_id, const char* client_name = ""); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index cc8ecb34a..291848a9f 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -2509,98 +2509,105 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } case ServerOP_CZMove: { - CZMove_Struct* CZM = (CZMove_Struct*) pack->pBuffer; - uint8 update_type = CZM->update_type; - uint8 update_subtype = CZM->update_subtype; - int update_identifier = CZM->update_identifier; - const char* zone_short_name = CZM->zone_short_name; - uint16 instance_id = CZM->instance_id; - const char* client_name = CZM->client_name; + auto s = (CZMove_Struct*) pack->pBuffer; + + const std::string& client_name = s->client_name; + const glm::vec4& coordinates = s->coordinates; + const uint16 instance_id = s->instance_id; + const uint32 update_identifier = s->update_identifier; + const uint8 update_type = s->update_type; + const uint8 update_subtype = s->update_subtype; + const std::string& zone_short_name = s->zone_short_name; + + if (Strings::IsNumber(client_name) || Strings::IsNumber(zone_short_name)) { + break; + } + if (update_type == CZUpdateType_Character) { - auto client = entity_list.GetClientByCharID(update_identifier); - if (client) { + Client* c = entity_list.GetClientByCharID(update_identifier); + if (c) { switch (update_subtype) { case CZMoveUpdateSubtype_MoveZone: - client->MoveZone(zone_short_name); + c->MoveZone(zone_short_name.c_str(), coordinates); break; case CZMoveUpdateSubtype_MoveZoneInstance: - client->MoveZoneInstance(instance_id); + c->MoveZoneInstance(instance_id, coordinates); break; } } } else if (update_type == CZUpdateType_Group) { - auto client_group = entity_list.GetGroupByID(update_identifier); - if (client_group) { - for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { - if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { - auto group_member = client_group->members[member_index]->CastToClient(); + Group* g = entity_list.GetGroupByID(update_identifier); + if (g) { + for (const auto& gm : g->members) { + if (gm->IsClient()) { + Client* c = gm->CastToClient(); switch (update_subtype) { case CZMoveUpdateSubtype_MoveZone: - group_member->MoveZone(zone_short_name); + c->MoveZone(zone_short_name.c_str(), coordinates); break; case CZMoveUpdateSubtype_MoveZoneInstance: - group_member->MoveZoneInstance(instance_id); + c->MoveZoneInstance(instance_id, coordinates); break; } } } } } else if (update_type == CZUpdateType_Raid) { - auto client_raid = entity_list.GetRaidByID(update_identifier); - if (client_raid) { - for (const auto& m : client_raid->members) { - if (m.is_bot) { + Raid* r = entity_list.GetRaidByID(update_identifier); + if (r) { + for (const auto& rm : r->members) { + if (rm.is_bot) { continue; } - if (m.member && m.member->IsClient()) { - auto raid_member = m.member->CastToClient(); + if (rm.member && rm.member->IsClient()) { + Client* m = rm.member->CastToClient(); switch (update_subtype) { case CZMoveUpdateSubtype_MoveZone: - raid_member->MoveZone(zone_short_name); + m->MoveZone(zone_short_name.c_str(), coordinates); break; case CZMoveUpdateSubtype_MoveZoneInstance: - raid_member->MoveZoneInstance(instance_id); + m->MoveZoneInstance(instance_id, coordinates); break; } } } } } else if (update_type == CZUpdateType_Guild) { - for (auto &client: entity_list.GetClientList()) { - if (client.second->GuildID() > 0 && client.second->GuildID() == update_identifier) { + for (auto& c : entity_list.GetClientList()) { + if (c.second && c.second->IsInAGuild() && c.second->IsInGuild(update_identifier)) { switch (update_subtype) { case CZMoveUpdateSubtype_MoveZone: - client.second->MoveZone(zone_short_name); + c.second->MoveZone(zone_short_name.c_str(), coordinates); break; case CZMoveUpdateSubtype_MoveZoneInstance: - client.second->MoveZoneInstance(instance_id); + c.second->MoveZoneInstance(instance_id, coordinates); break; } } } } else if (update_type == CZUpdateType_Expedition) { - for (auto &client: entity_list.GetClientList()) { - if (client.second->GetExpedition() && client.second->GetExpedition()->GetID() == update_identifier) { + for (auto& c : entity_list.GetClientList()) { + if (c.second && c.second->GetExpeditionID() == update_identifier) { switch (update_subtype) { case CZMoveUpdateSubtype_MoveZone: - client.second->MoveZone(zone_short_name); + c.second->MoveZone(zone_short_name.c_str(), coordinates); break; case CZMoveUpdateSubtype_MoveZoneInstance: - client.second->MoveZoneInstance(instance_id); + c.second->MoveZoneInstance(instance_id, coordinates); break; } } } } else if (update_type == CZUpdateType_ClientName) { - auto client = entity_list.GetClientByName(client_name); - if (client) { + Client* c = entity_list.GetClientByName(client_name.c_str()); + if (c) { switch (update_subtype) { case CZMoveUpdateSubtype_MoveZone: - client->MoveZone(zone_short_name); + c->MoveZone(zone_short_name.c_str(), coordinates); break; case CZMoveUpdateSubtype_MoveZoneInstance: - client->MoveZoneInstance(instance_id); + c->MoveZoneInstance(instance_id, coordinates); break; } } @@ -3106,21 +3113,29 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } case ServerOP_WWMove: { - WWMove_Struct* WWM = (WWMove_Struct*) pack->pBuffer; - uint8 update_type = WWM->update_type; - uint16 instance_id = WWM->instance_id; - const char* zone_short_name = WWM->zone_short_name; - uint8 min_status = WWM->min_status; - uint8 max_status = WWM->max_status; + auto m = (WWMove_Struct*) pack->pBuffer; + + uint16 instance_id = m->instance_id; + uint8 max_status = m->max_status; + uint8 min_status = m->min_status; + uint8 update_type = m->update_type; + std::string zone_short_name = m->zone_short_name; + for (auto &client : entity_list.GetClientList()) { switch (update_type) { case WWMoveUpdateType_MoveZone: - if (client.second->Admin() >= min_status && (client.second->Admin() <= max_status || max_status == AccountStatus::Player)) { - client.second->MoveZone(zone_short_name); + if ( + client.second->Admin() >= min_status && + (client.second->Admin() <= max_status || max_status == AccountStatus::Player) + ) { + client.second->MoveZone(zone_short_name.c_str()); } break; case WWMoveUpdateType_MoveZoneInstance: - if (client.second->Admin() >= min_status && (client.second->Admin() <= max_status || max_status == AccountStatus::Player)) { + if ( + client.second->Admin() >= min_status && + (client.second->Admin() <= max_status || max_status == AccountStatus::Player) + ) { client.second->MoveZoneInstance(instance_id); } break; diff --git a/zone/zoning.cpp b/zone/zoning.cpp index c76e49e98..882799bbe 100644 --- a/zone/zoning.cpp +++ b/zone/zoning.cpp @@ -575,32 +575,41 @@ void Client::MovePC(uint32 zoneID, uint32 instanceID, float x, float y, float z, } void Client::MoveZone(const char *zone_short_name, const glm::vec4 &location) { - ProcessMovePC(ZoneID(zone_short_name), 0, location.x, location.y, location.z, location.w, 3, ZoneToSafeCoords); + const bool use_coordinates = ( + location.x != 0.0f || + location.y != 0.0f || + location.z != 0.0f || + location.w != 0.0f + ); + + const ZoneMode zone_type = use_coordinates ? ZoneSolicited : ZoneToSafeCoords; + + ProcessMovePC(ZoneID(zone_short_name), 0, location.x, location.y, location.z, location.w, 3, zone_type); } void Client::MoveZoneGroup(const char *zone_short_name, const glm::vec4 &location) { - if (!GetGroup()) { + Group* g = GetGroup(); + if (!g) { MoveZone(zone_short_name, location); } else { - auto client_group = GetGroup(); - for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { - if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { - auto group_member = client_group->members[member_index]->CastToClient(); - group_member->MoveZone(zone_short_name, location); + for (const auto& gm : g->members) { + if (gm && gm->IsClient()) { + Client* c = gm->CastToClient(); + c->MoveZone(zone_short_name, location); } } } } void Client::MoveZoneRaid(const char *zone_short_name, const glm::vec4 &location) { - if (!GetRaid()) { + Raid* r = GetRaid(); + if (!r) { MoveZone(zone_short_name, location); } else { - auto client_raid = GetRaid(); - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); - raid_member->MoveZone(zone_short_name, location); + for (const auto& rm : r->members) { + if (rm.member && rm.member->IsClient()) { + Client* c = rm.member->CastToClient(); + c->MoveZone(zone_short_name, location); } } } @@ -611,32 +620,41 @@ void Client::MoveZoneInstance(uint16 instance_id, const glm::vec4 &location) { database.AddClientToInstance(instance_id, CharacterID()); } - ProcessMovePC(database.GetInstanceZoneID(instance_id), instance_id, location.x, location.y, location.z, location.w, 3, ZoneToSafeCoords); + const bool use_coordinates = ( + location.x != 0.0f || + location.y != 0.0f || + location.z != 0.0f || + location.w != 0.0f + ); + + const ZoneMode zone_type = use_coordinates ? ZoneSolicited : ZoneToSafeCoords; + + ProcessMovePC(database.GetInstanceZoneID(instance_id), instance_id, location.x, location.y, location.z, location.w, 3, zone_type); } void Client::MoveZoneInstanceGroup(uint16 instance_id, const glm::vec4 &location) { - if (!GetGroup()) { + Group* g = GetGroup(); + if (!g) { MoveZoneInstance(instance_id, location); } else { - auto client_group = GetGroup(); - for (int member_index = 0; member_index < MAX_GROUP_MEMBERS; member_index++) { - if (client_group->members[member_index] && client_group->members[member_index]->IsClient()) { - auto group_member = client_group->members[member_index]->CastToClient(); - group_member->MoveZoneInstance(instance_id, location); + for (const auto& gm : g->members) { + if (gm && gm->IsClient()) { + Client* c = gm->CastToClient(); + c->MoveZoneInstance(instance_id, location); } } } } void Client::MoveZoneInstanceRaid(uint16 instance_id, const glm::vec4 &location) { - if (!GetRaid()) { + Raid* r = GetRaid(); + if (!r) { MoveZoneInstance(instance_id, location); } else { - auto client_raid = GetRaid(); - for (int member_index = 0; member_index < MAX_RAID_MEMBERS; member_index++) { - if (client_raid->members[member_index].member && client_raid->members[member_index].member->IsClient()) { - auto raid_member = client_raid->members[member_index].member->CastToClient(); - raid_member->MoveZoneInstance(instance_id, location); + for (const auto& rm : r->members) { + if (rm.member && rm.member->IsClient()) { + Client* c = rm.member->CastToClient(); + c->MoveZoneInstance(instance_id, location); } } }