aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRat <none@none>2010-09-25 23:52:17 +0200
committerRat <none@none>2010-09-25 23:52:17 +0200
commit9ea9effadd1859c8c3edcce888b3cdae43e98561 (patch)
treeeaa967f240872e53f74b16174e90ebff8618b999 /src
parenta1358880c2211ffbfbba6ca632e03b48b69f7259 (diff)
Core/Scripts/SmartAI: add test for TextMgr (temp)
Core/CreatureTextMgr: added basic chat function, you can now experiment with it if bored --HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartAI/SmartAI.cpp9
-rw-r--r--src/server/game/AI/SmartAI/SmartAI.h6
-rw-r--r--src/server/game/Texts/CreatureTextMgr.cpp133
-rw-r--r--src/server/game/Texts/CreatureTextMgr.h14
4 files changed, 158 insertions, 4 deletions
diff --git a/src/server/game/AI/SmartAI/SmartAI.cpp b/src/server/game/AI/SmartAI/SmartAI.cpp
index 987cef83c39..8e513950a6f 100644
--- a/src/server/game/AI/SmartAI/SmartAI.cpp
+++ b/src/server/game/AI/SmartAI/SmartAI.cpp
@@ -25,15 +25,17 @@
#include "ObjectDefines.h"
#include "GridDefines.h"
#include "ConditionMgr.h"
+#include "CreatureTextMgr.h"
void SmartAIMgr::LoadSmartAIFromDB()
{
//Drop Existing SmartAI List
}
-SmartAI::SmartAI(Creature *c) : CreatureAI(c), me(c)
+SmartAI::SmartAI(Creature *c) : CreatureAI(c)
{
// copy script to local (pretection for table reload)
+ mTestTimer = 0;
}
int SmartAI::Permissible(const Creature *creature)
@@ -45,6 +47,11 @@ int SmartAI::Permissible(const Creature *creature)
void SmartAI::UpdateAI(const uint32 diff)
{
+ if (mTestTimer < diff)
+ {
+ mTestTimer = 60000;
+ sCreatureTextMgr.SendChat(me,"CHAT_TYPE_SAY", CHAT_TYPE_SAY);
+ } else mTestTimer -= diff;
}
void SmartAI::JustRespawned()
diff --git a/src/server/game/AI/SmartAI/SmartAI.h b/src/server/game/AI/SmartAI/SmartAI.h
index 78ba54eb23c..021791ab1b6 100644
--- a/src/server/game/AI/SmartAI/SmartAI.h
+++ b/src/server/game/AI/SmartAI/SmartAI.h
@@ -50,6 +50,8 @@ void setinhabittype
event change flags
+need a local SendChat()
+
*/
//temp copied from eai, will be modded
@@ -247,9 +249,6 @@ class SmartAIMgr
class SmartAI : public CreatureAI
{
- protected:
- Creature * const me;
-
public:
~SmartAI(){};
explicit SmartAI(Creature *c);
@@ -363,6 +362,7 @@ class SmartAI : public CreatureAI
void SetMovePathEndAction(SMARTAI_ACTION action = SMART_ACTION_FORCE_DESPAWN);
private:
+ uint32 mTestTimer;
};
#define sSmartAIMgr (*ACE_Singleton<SmartAIMgr, ACE_Null_Mutex>::instance())
diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp
index 1183c5db1e2..9557362ea36 100644
--- a/src/server/game/Texts/CreatureTextMgr.cpp
+++ b/src/server/game/Texts/CreatureTextMgr.cpp
@@ -107,3 +107,136 @@ void CreatureTextMgr::LoadCreatureTexts()
sLog.outString();
sLog.outString(">> Loaded %u Creature Texts for %u Creatures.", TextCount, CreatureCount);
}
+
+void CreatureTextMgr::SendChat(WorldObject* source, char const* text, ChatType msgtype, Language language, uint64 whisperGuid, TextRange range) const
+{
+ WorldPacket data(SMSG_MESSAGECHAT, 200);
+ BuildMonsterChat(&data, source, msgtype, text, language, whisperGuid);//build our packet
+ SendChatPacket(&data, source, msgtype, whisperGuid, range);//send our packet
+}
+
+void CreatureTextMgr::BuildMonsterChat(WorldPacket *data, WorldObject* source, ChatType msgtype, char const* text, Language language, uint64 whisperGuid) const
+{
+ ChatMsg sendType = CHAT_MSG_MONSTER_SAY;
+ switch (msgtype)
+ {
+ case CHAT_TYPE_YELL:
+ sendType = CHAT_MSG_MONSTER_YELL;
+ break;
+ case CHAT_TYPE_TEXT_EMOTE:
+ sendType = CHAT_MSG_MONSTER_EMOTE;
+ break;
+ case CHAT_TYPE_BOSS_EMOTE:
+ sendType = CHAT_MSG_RAID_BOSS_EMOTE;
+ break;
+ case CHAT_TYPE_WHISPER:
+ if (whisperGuid)
+ sendType = CHAT_MSG_MONSTER_WHISPER;
+ else
+ {
+ sLog.outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent CHAT_TYPE_WHISPER with targetGuid 0. Ignoring.",source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow());
+ return;
+ }
+ break;
+ case CHAT_TYPE_BOSS_WHISPER:
+ if (whisperGuid)
+ sendType = CHAT_MSG_RAID_BOSS_WHISPER;
+ else
+ {
+ sLog.outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent CHAT_TYPE_BOSS_WHISPER with targetGuid 0. Ignoring.",source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow());
+ return;
+ }
+ break;
+ case CHAT_TYPE_SAY://default type
+ default:
+ break;
+ }
+ *data << (uint8)sendType;
+ *data << (uint32)language;
+ *data << (uint64)source->GetGUID();
+ *data << (uint32)0; // 2.1.0
+ *data << (uint32)(strlen(source->GetName())+1);
+ *data << source->GetName();
+ *data << (uint64)whisperGuid; // Unit Target
+ if (whisperGuid && !IS_PLAYER_GUID(whisperGuid)) //can only whisper players
+ {
+ sLog.outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent WHISPER msg to Non-Player target. Ignoring.",source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow());
+ return;
+ //*data << (uint32)1; // target name length
+ //*data << (uint8)0; // target name
+ }
+ *data << (uint32)(strlen(text)+1);
+ *data << text;
+ *data << (uint8)0; // ChatTag
+}
+
+void CreatureTextMgr::SendChatPacket(WorldPacket *data, WorldObject* source, ChatType msgtype, uint64 whisperGuid, TextRange range) const
+{
+ float dist = sWorld.getFloatConfig(CONFIG_LISTEN_RANGE_SAY);
+
+ switch (msgtype)
+ {
+ case CHAT_TYPE_YELL:
+ dist = sWorld.getFloatConfig(CONFIG_LISTEN_RANGE_YELL);
+ break;
+ case CHAT_TYPE_BOSS_EMOTE:
+ case CHAT_TYPE_TEXT_EMOTE:
+ dist = sWorld.getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE);
+ break;
+ case CHAT_TYPE_WHISPER:
+ case CHAT_TYPE_BOSS_WHISPER:
+ {
+ if (range != TEXT_RANGE_NORMAL)
+ {
+ sLog.outError("CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent WHISPER msg with TextRange set. Ignoring.",source->GetName(), uint32(source->GetTypeId()), source->GetGUIDLow());
+ return;
+ }
+ Player *player = sObjectMgr.GetPlayer(whisperGuid);
+ if (!player || !player->GetSession())
+ return;
+ player->GetSession()->SendPacket(data);
+ }
+ return;
+ case CHAT_TYPE_SAY://default dist
+ default:
+ break;
+ }
+
+ switch (range)
+ {
+ case TEXT_RANGE_AREA:
+ {
+ uint32 areaId = source->GetAreaId();
+ Map::PlayerList const& pList = source->GetMap()->GetPlayers();
+ for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
+ if (itr->getSource()->GetAreaId() == areaId)
+ (itr->getSource())->GetSession()->SendPacket(data);
+ }
+ return;
+ case TEXT_RANGE_ZONE:
+ {
+ uint32 zoneId = source->GetZoneId();
+ Map::PlayerList const& pList = source->GetMap()->GetPlayers();
+ for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
+ if (itr->getSource()->GetZoneId() == zoneId)
+ (itr->getSource())->GetSession()->SendPacket(data);
+ }
+ return;
+ case TEXT_RANGE_MAP:
+ {
+ Map::PlayerList const& pList = source->GetMap()->GetPlayers();
+ for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
+ (itr->getSource())->GetSession()->SendPacket(data);
+ }
+ return;
+ case TEXT_RANGE_WORLD:
+ {
+ sWorld.SendGlobalMessage(data);
+ }
+ return;
+ case TEXT_RANGE_NORMAL:
+ default:
+ break;
+ }
+ source->SendMessageToSetInRange(data, dist, true);
+}
diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h
index b35beddd64a..11ba84f691b 100644
--- a/src/server/game/Texts/CreatureTextMgr.h
+++ b/src/server/game/Texts/CreatureTextMgr.h
@@ -41,6 +41,16 @@ struct CreatureTextEntry
uint32 sound;
};
+enum TextRange
+{
+ TEXT_RANGE_NORMAL = 0,
+ TEXT_RANGE_AREA = 1,
+ TEXT_RANGE_ZONE = 2,
+ TEXT_RANGE_MAP = 3,
+ TEXT_RANGE_WORLD = 4
+};
+
+
typedef std::vector<CreatureTextEntry> CreatureTextGroup; //texts in a group
typedef UNORDERED_MAP<uint32, CreatureTextGroup> CreatureTextHolder; //groups for a creature
@@ -55,8 +65,12 @@ class CreatureTextMgr
void LoadCreatureTexts();
CreatureTextMap const& GetTextMap() const { return mTextMap; }
+ void SendChat(WorldObject* source, char const* text, ChatType msgtype = CHAT_TYPE_SAY, Language language = LANG_UNIVERSAL, uint64 whisperGuid = 0, TextRange range = TEXT_RANGE_NORMAL) const;
+
private:
CreatureTextMap mTextMap;
+ void BuildMonsterChat(WorldPacket *data, WorldObject* source, ChatType msgtype, char const* text, Language language, uint64 whisperGuid) const;
+ void SendChatPacket(WorldPacket *data, WorldObject* source, ChatType msgtype, uint64 whisperGuid, TextRange range) const;
};
#define sCreatureTextMgr (*ACE_Singleton<CreatureTextMgr, ACE_Null_Mutex>::instance())