diff --git a/common/servertalk.h b/common/servertalk.h index 032df1ddc..318e0cf06 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_CZMessageGuild 0x4021 /** * QueryServer @@ -1334,6 +1335,12 @@ struct CZMessagePlayer_Struct { char Message[512]; }; +struct CZMessageGuild_Struct { + uint32 Type; + int GuildID; + char Message[512]; +}; + struct WWMarquee_Struct { uint32 Type; uint32 Priority; diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index 08ccbfaff..3f1c8eae0 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -1238,6 +1238,7 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) { } case ServerOP_CZSignalClientByName: case ServerOP_CZMessagePlayer: + case ServerOP_CZMessageGuild: case ServerOP_CZSignalNPC: case ServerOP_CZSetEntityVariableByNPCTypeID: case ServerOP_CZSignalClient: diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index c65cd204c..55ca42c00 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -3757,6 +3757,23 @@ XS(XS__crosszonemessageplayerbyname) { XSRETURN_EMPTY; } +XS(XS__crosszonemessageplayerbyguildid); +XS(XS__crosszonemessageplayerbyguildid) { + dXSARGS; + + if (items != 3) + Perl_croak(aTHX_ "Usage: quest::crosszonemessageplayerbyguildid(int typ, int guild_id, string message)"); + + if (items == 3) { + uint32 type = (uint32) SvIV(ST(0)); + int guild_id = (int) SvIV(ST(1)); + char *message = (char *) SvPV_nolen(ST(2)); + quest_manager.CrossZoneMessagePlayerByGuildID(type, guild_id, message); + } + + XSRETURN_EMPTY; +} + XS(XS__enablerecipe); XS(XS__enablerecipe) { dXSARGS; @@ -4173,6 +4190,7 @@ EXTERN_C XS(boot_quest) { newXS(strcpy(buf, "creategroundobjectfrommodel"), XS__CreateGroundObjectFromModel, file); newXS(strcpy(buf, "createguild"), XS__createguild, file); newXS(strcpy(buf, "crosszonemessageplayerbyname"), XS__crosszonemessageplayerbyname, file); + newXS(strcpy(buf, "crosszonemessageplayerbyguildid"), XS__crosszonemessageplayerbyguildid, file); newXS(strcpy(buf, "crosszonesetentityvariablebynpctypeid"), XS__crosszonesetentityvariablebynpctypeid, file); newXS(strcpy(buf, "crosszonesetentityvariablebyclientname"), XS__crosszonesetentityvariablebyclientname, file); newXS(strcpy(buf, "crosszonesignalclientbycharid"), XS__crosszonesignalclientbycharid, file); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index d047238de..ee3318f31 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -1034,6 +1034,10 @@ void lua_cross_zone_message_player_by_name(uint32 type, const char *player, cons quest_manager.CrossZoneMessagePlayerByName(type, player, message); } +void lua_cross_zone_message_player_by_guild_id(uint32 type, int guild_id, const char *message) { + quest_manager.CrossZoneMessagePlayerByGuildID(type, guild_id, message); +} + void lua_cross_zone_set_entity_variable_by_client_name(const char *player, const char *id, const char *m_var) { quest_manager.CrossZoneSetEntityVariableByClientName(player, id, m_var); } @@ -1841,6 +1845,7 @@ luabind::scope lua_register_general() { luabind::def("cross_zone_signal_client_by_char_id", &lua_cross_zone_signal_client_by_char_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_message_player_by_guild_id", &lua_cross_zone_message_player_by_guild_id), luabind::def("cross_zone_set_entity_variable_by_client_name", &lua_cross_zone_set_entity_variable_by_client_name), luabind::def("world_wide_marquee", &lua_world_wide_marquee), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_NPC,Lua_Client))&lua_get_qglobals), diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index ba6a5340c..38e6c808c 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -3234,6 +3234,17 @@ void QuestManager::CrossZoneMessagePlayerByName(uint32 Type, const char *CharNam safe_delete(pack); } +void QuestManager::CrossZoneMessagePlayerByGuildID(uint32 Type, int GuildID, const char *Message){ + uint32 message_len = strlen(Message) + 1; + auto pack = new ServerPacket(ServerOP_CZMessageGuild, sizeof(CZMessageGuild_Struct) + message_len); + CZMessageGuild_Struct* CZGM = (CZMessageGuild_Struct*) pack->pBuffer; + CZGM->Type = Type; + CZGM->GuildID = GuildID; + strn0cpy(CZGM->Message, Message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + void QuestManager::CrossZoneSetEntityVariableByClientName(const char *CharName, const char *id, const char *m_var){ uint32 message_len = strlen(id) + 1; uint32 message_len2 = strlen(m_var) + 1; diff --git a/zone/questmgr.h b/zone/questmgr.h index 14ddea9c8..15c46f694 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -284,6 +284,7 @@ public: void CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, const char *id, const char *m_var); void CrossZoneSetEntityVariableByClientName(const char *CharName, const char *id, const char *m_var); void CrossZoneMessagePlayerByName(uint32 Type, const char *CharName, const char *Message); + void CrossZoneMessagePlayerByGuildID(uint32 Type, int GuildID, const char *Message); void WorldWideMarquee(uint32 Type, uint32 Priority, uint32 FadeIn, uint32 FadeOut, uint32 Duration, const char *Message); bool EnableRecipe(uint32 recipe_id); bool DisableRecipe(uint32 recipe_id); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 4b2034067..46bac74ed 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -1933,6 +1933,17 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) } break; } + case ServerOP_CZMessageGuild: + { + CZMessageGuild_Struct* CZGM = (CZMessageGuild_Struct*)pack->pBuffer; + auto client_list = entity_list.GetClientList(); + for (auto client : client_list) { + if (client.second->GuildID() > 0 && client.second->GuildID() == CZGM->GuildID) { + client.second->Message(CZGM->Type, CZGM->Message); + } + } + break; + } case ServerOP_CZSetEntityVariableByClientName: { CZSetEntVarByClientName_Struct* CZCS = (CZSetEntVarByClientName_Struct*)pack->pBuffer;