关灯
开启左侧

T端中带时间间隔限制和聊天字符限制的世界喊话系统

  [复制链接]
admin实名认证 发表于 2016-4-24 18:03:05 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
这个是一个Trinity端的设计公告系统,该系统与其他的世界公告不同的地方在于:
1、可以限制每次世界喊话后,下次喊话的时间间隔。这样就不会出现玩家刷屏的情况

2、限制每次世界喊话最少的字符数量。

参考意义:可以通过该代码,获得时间间隔怎么设置和控制字符数量的配置



---
src/server/game/World/World.cpp              |   5 ++
src/server/game/World/World.h                |   3 +
src/server/scripts/Custom/CMakeLists.txt     |   1 +
src/server/scripts/Custom/World_Chat.cpp     | 119 +++++++++++++++++++++++++++
src/server/worldserver/worldserver.conf.dist |  24 ++++++
5 files changed, 152 insertions(+)
create mode 100644 src/server/scripts/Custom/World_Chat.cpp

diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index ec11a29..a627a90 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1221,6 +1221,11 @@ void World::LoadConfigSettings(bool reload)
     m_int_configs[CONFIG_WINTERGRASP_NOBATTLETIME] = ConfigMgr::GetIntDefault("Wintergrasp.NoBattleTimer", 150);
     m_int_configs[CONFIG_WINTERGRASP_RESTART_AFTER_CRASH] = ConfigMgr::GetIntDefault("Wintergrasp.CrashRestartTimer", 10);

+    // World Chat
+    m_bool_configs[CONFIG_WORLD_CHAT_ENABLE] = ConfigMgr::GetBoolDefault("World_Chat.Enable", false);
+    m_int_configs[CONFIG_WORLD_CHAT_MINLENGTH] = ConfigMgr::GetIntDefault("World_Chat.MinLength", 0);
+    m_int_configs[CONFIG_WORLD_CHAT_MUTETIME] = ConfigMgr::GetIntDefault("World_Chat.MuteTime", 0);
+
     // call ScriptMgr if we're reloading the configuration
     if (reload)
         sScriptMgr->OnConfigLoad(reload);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 00bb9e7..2f97dd7 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -159,6 +159,7 @@ enum WorldBoolConfigs
     CONFIG_WINTERGRASP_ENABLE,
     CONFIG_UI_QUESTLEVELS_IN_DIALOGS,     // Should we add quest levels to the title in the NPC dialogs?
     CONFIG_EVENT_ANNOUNCE,
+    CONFIG_WORLD_CHAT_ENABLE,
     BOOL_CONFIG_VALUE_COUNT
};

@@ -320,6 +321,8 @@ enum WorldIntConfigs
     CONFIG_WINTERGRASP_BATTLETIME,
     CONFIG_WINTERGRASP_NOBATTLETIME,
     CONFIG_WINTERGRASP_RESTART_AFTER_CRASH,
+    CONFIG_WORLD_CHAT_MINLENGTH,
+    CONFIG_WORLD_CHAT_MUTETIME,
     INT_CONFIG_VALUE_COUNT
};

diff --git a/src/server/scripts/Custom/CMakeLists.txt b/src/server/scripts/Custom/CMakeLists.txt
index 99cf026..daf48e6 100644
--- a/src/server/scripts/Custom/CMakeLists.txt
+++ b/src/server/scripts/Custom/CMakeLists.txt
@@ -10,6 +10,7 @@

set(scripts_STAT_SRCS
   ${scripts_STAT_SRCS}
+Custom/World_Chat.cpp
)

message("  -> Prepared: Custom")
diff --git a/src/server/scripts/Custom/World_Chat.cpp b/src/server/scripts/Custom/World_Chat.cpp
new file mode 100644
index 0000000..38af933
--- /dev/null
+++ b/src/server/scripts/Custom/World_Chat.cpp
@@ -0,0 +1,119 @@
+/*
+
+By: @mthsena
+
+Script made by: @Ghostcrawler336
+Rewrote and improved by: @AlexeWarr
+
+*/
+#include "ScriptPCH.h"
+#include "Chat.h"
+
+// Ranks
+#define PLAYER                "<Player>"
+#define MODERATOR            "<MOD>"
+#define GAMEMASTER            "<GM>"
+#define ADMINISTRATOR        "<ADM>"
+#define CONSOLE                "<OWNER>"
+// Colors
+#define MSG_COLOR_WHITE        "|cffffffff"
+#define MSG_COLOR_CHAT        "|cff0bf10a"
+#define MSG_COLOR_MSG        "|cff4387c4"
+#define MSG_COLOR_PLAYER    "|cff00ffff"
+#define MSG_COLOR_MOD        "|cffffc800"
+#define MSG_COLOR_GM        "|cffff5f00"
+#define MSG_COLOR_ADM        "|cffff3c00"
+#define MSG_COLOR_OWNER        "|cffFF0000"
+
+void _SendWorldChat(Player* player, std::string message)
+{
+    std::string rank, color;
+    std::ostringstream chat_string;
+
+    switch(player->GetSession()->GetSecurity())
+    {
+    case SEC_PLAYER:
+        rank = PLAYER;
+        color = MSG_COLOR_PLAYER;
+        break;
+    case SEC_MODERATOR:   
+        rank = MODERATOR;
+        color = MSG_COLOR_MOD;
+        break;
+    case SEC_GAMEMASTER:
+        rank = GAMEMASTER;
+        color = MSG_COLOR_GM;
+        break;
+    case SEC_ADMINISTRATOR:
+        rank = ADMINISTRATOR;
+        color = MSG_COLOR_ADM;
+        break;
+    case SEC_CONSOLE:
+        rank = CONSOLE;
+        color = MSG_COLOR_OWNER;
+        break;
+    }
+
+    chat_string << color << rank << MSG_COLOR_WHITE << " " << ChatHandler(player->GetSession()).GetNameLink() << " " << MSG_COLOR_CHAT << "Chat: " << MSG_COLOR_MSG << message;
+
+    char msg[1024];
+
+    snprintf(msg, 1024, chat_string.str().c_str());
+
+    if(message.length() >= sWorld->getIntConfig(CONFIG_WORLD_CHAT_MINLENGTH))//这里就是判断字符的长度了
+    {
+        sWorld->SendGlobalText(msg, NULL);
+        if(sWorld->getIntConfig(CONFIG_WORLD_CHAT_MUTETIME) > 0) //这里开始设置每次喊话的时间间隔了
+        {
+            PreparedStatement * mt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
+            int64 muteTime = time(NULL) + sWorld->getIntConfig(CONFIG_WORLD_CHAT_MUTETIME);
+            player->GetSession()->m_muteTime = muteTime;
+            mt->setInt64(0, muteTime);
+        }
+    }
+    else
+        player->GetSession()->SendNotification("Your message has to be at least %d characters longer", sWorld->getIntConfig(CONFIG_WORLD_CHAT_MINLENGTH));
+
+}
+
+class World_Chat : public CommandScript
+{
+public:
+    World_Chat() : CommandScript("World_Chat"){}
+
+    static bool HandleWorldChatCommand(ChatHandler * pChat, const char * msg)
+    {
+        if (!sWorld->getBoolConfig(CONFIG_WORLD_CHAT_ENABLE))
+        {
+            pChat->PSendSysMessage("World Chat is disabled.");
+            pChat->SetSentErrorMessage(true);
+            return false;
+        }
+
+        if(!*msg)
+            return false;
+
+        Player* pPlayer = pChat->GetSession()->GetPlayer();
+
+        if (!pChat->GetSession()->GetPlayer()->CanSpeak())
+            return false;
+
+        _SendWorldChat(pChat->GetSession()->GetPlayer(), msg);
+        return true;
+    }
+
+    ChatCommand * GetCommands() const
+    {
+        static ChatCommand World_ChatCommandTable[] =
+        {
+            {"chat", SEC_PLAYER, true, &HandleWorldChatCommand, "", NULL},
+            {NULL, 0, false, NULL, "", NULL}
+        };
+        return World_ChatCommandTable;
+    }
+};
+
+void AddSC_World_Chat()
+{
+    new World_Chat;
+}
\ No newline at end of file
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index bf19240..4765836 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -27,6 +27,7 @@
#    CHARACTER DELETE OPTIONS
#    CUSTOM SERVER OPTIONS
#    LOGGING SYSTEM SETTINGS
+#    WORLD CHAT
#
###################################################################################################

@@ -2760,3 +2761,26 @@ Log.Async.Enable = 0

#
###################################################################################################
+
+###################################################################################################
+# WORLD CHAT
+#
+#    World_Chat.Enable
+#          Description: Enables the script World_Chat on server.   (这个地方就是控制是否开启世界喊话)
+#          Default:     0 - (Disabled)
+#                       1 - (Enabled)
+#    World_Chat.MinLength
+#          Description: Minimum characters to use the chat.  (每次世界喊话输入的最少的字符数)
+#                       Example: if 1, will need at least 1 character. (如果设置1,那么最少1个字符)
+#    World_Chat.MuteTime
+#          Description: MuteTime(in seconds) after use the chat, avoids the flood.(设置每次喊话的时间间隔。避免刷频)
+#          Default:     0 - (Disabled)
+#                       Example: if 1, will get 1 second mutetime.
+
+World_Chat.Enable = 1
+World_Chat.MinLength = 3
+World_Chat.MuteTime = 5
+
+#
+###################################################################################################
--
1.8.1.msysgit.1



OK,。代码就到这里。下面提供一个下载。。有些解释我已经些到代码里面了。其他的请大家自己看看


回复下载完整代码

游客,如果您要查看本帖隐藏内容请回复



 

精彩评论2

倒序浏览
12333 发表于 2019-12-19 00:39:25 | 显示全部楼层
 
支持吾爱 支持吾爱 支持吾爱 支持吾爱 支持吾爱 支持吾爱
 
我回来了 发表于 2016-10-29 21:26:41 | 显示全部楼层
 
小白一个 顶一下,吾爱尚玩免费服务端下载!
 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地