diff --git a/common/servertalk.h b/common/servertalk.h index 032df1ddc..5c5749fe3 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -198,6 +198,7 @@ #define ServerOP_UCSServerStatusRequest 0x4013 #define ServerOP_UCSServerStatusReply 0x4014 #define ServerOP_HotReloadQuests 0x4015 +#define ServerOP_CZSignalGroup 0x4016 /** * QueryServer @@ -1167,6 +1168,11 @@ struct CZClientSignal_Struct { uint32 data; }; +struct CZGroupSignal_Struct { + int group_id; + uint32 data; +}; + struct CZNPCSignal_Struct { uint32 npctype_id; uint32 data; diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 08ccbfaff..7731fd571 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -1241,6 +1241,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { case ServerOP_CZSignalNPC: case ServerOP_CZSetEntityVariableByNPCTypeID: case ServerOP_CZSignalClient: + case ServerOP_CZSignalGroup: case ServerOP_CZSetEntityVariableByClientName: case ServerOP_WWMarquee: case ServerOP_DepopAllPlayersCorpses: diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index c65cd204c..8f2714d64 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -3721,6 +3721,24 @@ XS(XS__crosszonesignalclientbycharid) { XSRETURN_EMPTY; } +XS(XS__crosszonesignalclientbygroupid); +XS(XS__crosszonesignalclientbygroupid) { + dXSARGS; + + if (items != 2) + Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbygroupid(int group_id, int value)"); + + if (items == 2) { + int group_id = (int) SvIV(ST(0)); + uint32 int_value = (uint32) SvIV(ST(1)); + quest_manager.CrossZoneSignalPlayerByGroupID(group_id, int_value); + } else { + Perl_croak(aTHX_ "Usage: quest::crosszonesignalclientbygroupid(int group_id, int value)"); + } + + XSRETURN_EMPTY; +} + XS(XS__crosszonesignalclientbyname); XS(XS__crosszonesignalclientbyname) { dXSARGS; @@ -4176,6 +4194,7 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "crosszonesetentityvariablebynpctypeid"), XS__crosszonesetentityvariablebynpctypeid, file); newXS(strcpy(buf, "crosszonesetentityvariablebyclientname"), XS__crosszonesetentityvariablebyclientname, file); newXS(strcpy(buf, "crosszonesignalclientbycharid"), XS__crosszonesignalclientbycharid, file); + newXS(strcpy(buf, "crosszonesignalclientbygroupid"), XS__crosszonesignalclientbygroupid, file); newXS(strcpy(buf, "crosszonesignalclientbyname"), XS__crosszonesignalclientbyname, file); newXS(strcpy(buf, "crosszonesignalnpcbynpctypeid"), XS__crosszonesignalnpcbynpctypeid, file); newXS(strcpy(buf, "worldwidemarquee"), XS__worldwidemarquee, file); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index d047238de..df890660c 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -1026,6 +1026,10 @@ void lua_cross_zone_signal_client_by_char_id(uint32 player_id, int signal) { quest_manager.CrossZoneSignalPlayerByCharID(player_id, signal); } +void lua_cross_zone_signal_client_by_group_id(uint32 group_id, int signal) { + quest_manager.CrossZoneSignalPlayerByGroupID(group_id, signal); +} + void lua_cross_zone_signal_client_by_name(const char *player, int signal) { quest_manager.CrossZoneSignalPlayerByName(player, signal); } @@ -1839,6 +1843,7 @@ luabind::scope lua_register_general() { luabind::def("voice_tell", &lua_voice_tell), luabind::def("send_mail", &lua_send_mail), luabind::def("cross_zone_signal_client_by_char_id", &lua_cross_zone_signal_client_by_char_id), + luabind::def("cross_zone_signal_client_by_group_id", &lua_cross_zone_signal_client_by_group_id), luabind::def("cross_zone_signal_client_by_name", &lua_cross_zone_signal_client_by_name), luabind::def("cross_zone_message_player_by_name", &lua_cross_zone_message_player_by_name), luabind::def("cross_zone_set_entity_variable_by_client_name", &lua_cross_zone_set_entity_variable_by_client_name), diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index ba6a5340c..e1933323f 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -3211,6 +3211,15 @@ void QuestManager::CrossZoneSignalPlayerByCharID(int charid, uint32 data){ safe_delete(pack); } +void QuestManager::CrossZoneSignalPlayerByGroupID(int group_id, uint32 data){ + auto pack = new ServerPacket(ServerOP_CZSignalGroup, sizeof(CZGroupSignal_Struct)); + CZGroupSignal_Struct* CZGS = (CZGroupSignal_Struct*) pack->pBuffer; + CZGS->group_id = group_id; + CZGS->data = data; + worldserver.SendPacket(pack); + safe_delete(pack); +} + void QuestManager::CrossZoneSignalPlayerByName(const char *CharName, uint32 data){ uint32 message_len = strlen(CharName) + 1; auto pack = new ServerPacket(ServerOP_CZSignalClientByName, sizeof(CZClientSignalByName_Struct) + message_len); diff --git a/zone/questmgr.h b/zone/questmgr.h index 14ddea9c8..2a12fcd84 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -279,6 +279,7 @@ public: int32 GetZoneID(const char *zone); const char *GetZoneLongName(const char *zone); void CrossZoneSignalPlayerByCharID(int charid, uint32 data); + void CrossZoneSignalPlayerByGroupID(int group_id, uint32 data); void CrossZoneSignalNPCByNPCTypeID(uint32 npctype_id, uint32 data); void CrossZoneSignalPlayerByName(const char *CharName, uint32 data); void CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, const char *id, const char *m_var); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 4b2034067..a983b7cfa 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -1915,6 +1915,17 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } break; } + case ServerOP_CZSignalGroup: + { + CZGroupSignal_Struct* CZGS = (CZGroupSignal_Struct*)pack->pBuffer; + auto client_list = entity_list.GetClientList(); + for (auto client : client_list) { + if (client.second->GetGroup() && client.second->GetGroup()->GetID() == CZGS->group_id) { + client.second->Signal(CZGS->data); + } + } + break; + } case ServerOP_CZSignalClientByName: { CZClientSignalByName_Struct* CZCS = (CZClientSignalByName_Struct*)pack->pBuffer;