diff --git a/common/servertalk.h b/common/servertalk.h index e476d023d..b0197985f 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -193,6 +193,7 @@ #define ServerOP_QSSendQuery 0x5016 #define ServerOP_CZSignalNPC 0x5017 #define ServerOP_CZSetEntityVariableByNPCTypeID 0x5018 +#define ServerOP_WWMarquee 0x5019 /* Query Serv Generic Packet Flag/Type Enumeration */ enum { QSG_LFGuild = 0 }; @@ -1254,6 +1255,15 @@ struct CZMessagePlayer_Struct { char Message[512]; }; +struct WWMarquee_Struct { + uint32 Type; + uint32 Priority; + uint32 FadeIn; + uint32 FadeOut; + uint32 Duration; + char Message[512]; +}; + struct CZSetEntVarByNPCTypeID_Struct { uint32 npctype_id; char id[256]; diff --git a/world/zoneserver.cpp b/world/zoneserver.cpp index abe6e0e18..9a9572f97 100644 --- a/world/zoneserver.cpp +++ b/world/zoneserver.cpp @@ -1312,6 +1312,7 @@ bool ZoneServer::Process() { case ServerOP_CZSignalNPC: case ServerOP_CZSetEntityVariableByNPCTypeID: case ServerOP_CZSignalClient: + case ServerOP_WWMarquee: case ServerOP_DepopAllPlayersCorpses: case ServerOP_DepopPlayerCorpse: case ServerOP_ReloadTitles: diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index b9b28f0a6..adaaf3325 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -3616,6 +3616,26 @@ XS(XS__crosszonesignalnpcbynpctypeid) XSRETURN_EMPTY; } +XS(XS__worldwidemarquee); +XS(XS__worldwidemarquee) +{ + dXSARGS; + if (items != 6) + Perl_croak(aTHX_ "Usage: worldwidemarquee(type, priority, fadein, fadeout, duration, message)"); + + if (items == 6) { + uint32 type = (uint32)SvIV(ST(0)); + uint32 priority = (uint32)SvIV(ST(1)); + uint32 fadein = (uint32)SvIV(ST(2)); + uint32 fadeout = (uint32)SvIV(ST(3)); + uint32 duration = (uint32)SvIV(ST(4)); + char* message = (char *)SvPV_nolen(ST(5)); + quest_manager.WorldWideMarquee(type, priority, fadein, fadeout, duration, message); + } + + XSRETURN_EMPTY; +} + XS(XS__debug); XS(XS__debug) { @@ -3749,6 +3769,7 @@ EXTERN_C XS(boot_quest) newXS(strcpy(buf, "crosszonesignalclientbycharid"), XS__crosszonesignalclientbycharid, file); newXS(strcpy(buf, "crosszonesignalclientbyname"), XS__crosszonesignalclientbyname, file); newXS(strcpy(buf, "crosszonesignalnpcbynpctypeid"), XS__crosszonesignalnpcbynpctypeid, file); + newXS(strcpy(buf, "worldwidemarquee"), XS__worldwidemarquee, file); newXS(strcpy(buf, "debug"), XS__debug, file); newXS(strcpy(buf, "delglobal"), XS__delglobal, file); newXS(strcpy(buf, "depop"), XS__depop, file); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index d47420fe1..9f413128b 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -892,6 +892,10 @@ void lua_cross_zone_message_player_by_name(uint32 type, const char *player, cons quest_manager.CrossZoneMessagePlayerByName(type, player, message); } +void lua_world_wide_marquee(uint32 type, uint32 priority, uint32 fadein, uint32 fadeout, uint32 duration, const char *message) { + quest_manager.WorldWideMarquee(type, priority, fadein, fadeout, duration, message); +} + luabind::adl::object lua_get_qglobals(lua_State *L, Lua_NPC npc, Lua_Client client) { luabind::adl::object ret = luabind::newtable(L); @@ -1613,6 +1617,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("world_wide_marquee", &lua_world_wide_marquee), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_NPC,Lua_Client))&lua_get_qglobals), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_Client))&lua_get_qglobals), luabind::def("get_qglobals", (luabind::adl::object(*)(lua_State*,Lua_NPC))&lua_get_qglobals), diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 78fc2b206..5803e547c 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -3017,6 +3017,20 @@ void QuestManager::CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, cons safe_delete(pack); } +void QuestManager::WorldWideMarquee(uint32 Type, uint32 Priority, uint32 FadeIn, uint32 FadeOut, uint32 Duration, const char *Message) { + uint32 message_len = strlen(Message) + 1; + auto pack = new ServerPacket(ServerOP_WWMarquee, sizeof(WWMarquee_Struct) + message_len); + WWMarquee_Struct* WWMS = (WWMarquee_Struct*) pack->pBuffer; + WWMS->Type = Type; + WWMS->Priority = Priority; + WWMS->FadeIn = FadeIn; + WWMS->FadeOut = FadeOut; + WWMS->Duration = Duration; + strn0cpy(WWMS->Message, Message, 512); + worldserver.SendPacket(pack); + safe_delete(pack); +} + bool QuestManager::EnableRecipe(uint32 recipe_id) { bool success = false; diff --git a/zone/questmgr.h b/zone/questmgr.h index 612c7815f..10c82c1ee 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -252,6 +252,7 @@ public: void CrossZoneSignalPlayerByName(const char *CharName, uint32 data); void CrossZoneSetEntityVariableByNPCTypeID(uint32 npctype_id, const char *id, const char *m_var); void CrossZoneMessagePlayerByName(uint32 Type, const char *CharName, 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); void ClearNPCTypeCache(int npctype_id); diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 0f00ed0c5..60a4e7385 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -1838,6 +1838,19 @@ void WorldServer::Process() { } break; } + case ServerOP_WWMarquee: + { + WWMarquee_Struct* WWMS = (WWMarquee_Struct*) pack->pBuffer; + std::list client_list; + entity_list.GetClientList(client_list); + auto iter = client_list.begin(); + std::string Message = WWMS->Message; + while (iter != client_list.end()) { + Client* client = (*iter); + client->SendMarqueeMessage(WWMS->Type, WWMS->Priority, WWMS->FadeIn, WWMS->FadeOut, WWMS->Duration, Message); + iter++; + } + } case ServerOP_ReloadWorld: { ReloadWorld_Struct* RW = (ReloadWorld_Struct*) pack->pBuffer;