2010-10-07 15:35:36 +02:00
/*
2011-01-01 15:01:13 +01:00
* Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
2010-10-07 15:35:36 +02:00
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
2010-09-25 18:47:03 +02:00
*/
#include "Common.h"
#include "DatabaseEnv.h"
#include "SQLStorage.h"
#include "CreatureTextMgr.h"
#include "ObjectMgr.h"
void CreatureTextMgr :: LoadCreatureTexts ()
{
2010-12-19 17:06:33 +01:00
uint32 oldMSTime = getMSTime ();
2010-09-25 18:47:03 +02:00
mTextMap . clear (); // for reload case
2010-09-26 20:48:25 +02:00
mTextRepeatMap . clear (); //reset all currently used temp texts
2010-09-25 18:47:03 +02:00
PreparedStatement * stmt = WorldDatabase . GetPreparedStatement ( WORLD_LOAD_CRETEXT );
PreparedQueryResult result = WorldDatabase . Query ( stmt );
2010-09-25 22:03:57 +02:00
2010-09-25 18:47:03 +02:00
if ( ! result )
{
2010-12-23 23:25:44 +01:00
sLog -> outString ( ">> Loaded 0 ceature texts. DB table `creature_texts` is empty." );
sLog -> outString ();
2010-09-25 18:47:03 +02:00
return ;
}
2010-09-25 22:03:57 +02:00
2010-12-19 17:06:33 +01:00
uint32 textCount = 0 ;
uint32 creatureCount = 0 ;
2010-09-25 18:47:03 +02:00
do
{
Field * fields = result -> Fetch ();
CreatureTextEntry temp ;
2010-09-29 23:26:28 +02:00
temp . entry = fields [ 0 ]. GetUInt32 ();
2010-09-25 18:47:03 +02:00
temp . group = fields [ 1 ]. GetUInt8 ();
temp . id = fields [ 2 ]. GetUInt8 ();
temp . text = fields [ 3 ]. GetString ();
temp . type = ChatType ( fields [ 4 ]. GetUInt8 ());
temp . lang = Language ( fields [ 5 ]. GetUInt8 ());
temp . probability = fields [ 6 ]. GetFloat ();
temp . emote = Emote ( fields [ 7 ]. GetUInt32 ());
temp . duration = fields [ 8 ]. GetUInt32 ();
temp . sound = fields [ 9 ]. GetUInt32 ();
if ( temp . sound )
{
if ( ! sSoundEntriesStore . LookupEntry ( temp . sound )){
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( "CreatureTextMgr: Entry %u, Group %u in table `creature_texts` has Sound %u but sound does not exist." , temp . entry , temp . group , temp . sound );
2010-09-25 18:47:03 +02:00
temp . sound = 0 ;
}
}
if ( ! GetLanguageDescByID ( temp . lang ))
{
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( "CreatureTextMgr: Entry %u, Group %u in table `creature_texts` using Language %u but Language does not exist." , temp . entry , temp . group , uint32 ( temp . lang ));
2010-09-25 18:47:03 +02:00
temp . lang = LANG_UNIVERSAL ;
}
2010-09-29 23:26:28 +02:00
if ( temp . type >= CHAT_TYPE_ZONE_YELL ) //CHAT_TYPE_ZONE_YELL and more will be used later
2010-09-25 18:47:03 +02:00
{
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( "CreatureTextMgr: Entry %u, Group %u in table `creature_texts` has Type %u but this Chat Type does not exist." , temp . entry , temp . group , uint32 ( temp . type ));
2010-09-25 18:47:03 +02:00
temp . type = CHAT_TYPE_SAY ;
}
if ( temp . emote )
{
if ( ! sEmotesStore . LookupEntry ( temp . emote ))
{
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( "CreatureTextMgr: Entry %u, Group %u in table `creature_texts` has Emote %u but emote does not exist." , temp . entry , temp . group , uint32 ( temp . emote ));
2010-09-25 18:47:03 +02:00
temp . emote = EMOTE_ONESHOT_NONE ;
}
}
//entry not yet added, add empty TextHolder (list of groups)
if ( mTextMap . find ( temp . entry ) == mTextMap . end ())
{
2010-12-19 17:06:33 +01:00
++ creatureCount ;
2010-09-25 18:47:03 +02:00
CreatureTextHolder TextHolder ;
mTextMap [ temp . entry ] = TextHolder ;
}
//group not yet added, add empty TextGroup (list of texts)
if ( mTextMap [ temp . entry ]. find ( temp . group ) == mTextMap [ temp . entry ]. end ())
{
CreatureTextGroup TextGroup ;
mTextMap [ temp . entry ][ temp . group ] = TextGroup ;
}
//add the text into our entry's group
mTextMap [ temp . entry ][ temp . group ]. push_back ( temp );
2010-09-25 22:03:57 +02:00
2010-12-19 17:06:33 +01:00
++ textCount ;
2010-09-25 18:47:03 +02:00
} while ( result -> NextRow ());
2010-12-23 23:25:44 +01:00
sLog -> outString ( ">> Loaded %u creature texts for %u creatures in %u ms" , textCount , creatureCount , GetMSTimeDiffToNow ( oldMSTime ));
sLog -> outString ();
2010-09-25 18:47:03 +02:00
}
2010-09-25 23:52:17 +02:00
2010-11-05 19:38:43 +01:00
uint32 CreatureTextMgr :: SendChat ( Creature * source , uint8 textGroup , uint64 whisperGuid , ChatType msgtype , Language language , TextRange range , uint32 sound , Team team , bool gmOnly , Player * srcPlr )
2010-09-25 23:52:17 +02:00
{
2010-09-26 20:48:25 +02:00
if ( ! source )
2010-09-29 23:26:28 +02:00
return 0 ;
2010-09-26 20:48:25 +02:00
CreatureTextMap :: const_iterator sList = mTextMap . find ( source -> GetEntry ());
if ( sList == mTextMap . end ())
{
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( "CreatureTextMgr: Could not find Text for Creature(%s) Entry %u in 'creature_text' table. Ignoring." , source -> GetName (), source -> GetEntry ());
2010-09-29 23:26:28 +02:00
return 0 ;
2010-09-26 20:48:25 +02:00
}
CreatureTextHolder TextHolder = ( * sList ). second ;
CreatureTextHolder :: const_iterator itr = TextHolder . find ( textGroup );
if ( itr == TextHolder . end ())
{
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( "CreatureTextMgr: Could not find TextGroup %u for Creature(%s) GuidLow %u Entry %u. Ignoring." , uint32 ( textGroup ), source -> GetName (), source -> GetGUIDLow (), source -> GetEntry ());
2010-09-29 23:26:28 +02:00
return 0 ;
2010-09-26 20:48:25 +02:00
}
CreatureTextGroup TextGroup = ( * itr ). second ; //has all texts in the group
CreatureTextRepeatIds repeatGroup = GetRepeatGroup ( source , textGroup ); //has all textIDs from the group that were already said
CreatureTextGroup tempGroup ; //will use this to talk after sorting repeatGroup
for ( CreatureTextGroup :: const_iterator giter = TextGroup . begin (); giter != TextGroup . end (); ++ giter )
{
if ( std :: find ( repeatGroup . begin (), repeatGroup . end (), ( * giter ). id ) == repeatGroup . end ())
tempGroup . push_back (( * giter ));
}
if ( tempGroup . empty ())
{
CreatureTextRepeatMap :: iterator mapItr = mTextRepeatMap . find ( source -> GetGUID ());
if ( mapItr != mTextRepeatMap . end ())
{
CreatureTextRepeatGroup :: iterator groupItr = ( * mapItr ). second . find ( textGroup );
( * groupItr ). second . clear ();
}
tempGroup = TextGroup ;
}
uint8 count = 0 ;
float lastChance = - 1 ;
bool isEqualChanced = true ;
float totalChance = 0 ;
for ( CreatureTextGroup :: const_iterator iter = tempGroup . begin (); iter != tempGroup . end (); ++ iter )
{
if ( lastChance >= 0 && lastChance != ( * iter ). probability )
isEqualChanced = false ;
lastChance = ( * iter ). probability ;
totalChance += ( * iter ). probability ;
count ++ ;
}
2010-09-29 23:26:28 +02:00
int32 offset = - 1 ;
if ( ! isEqualChanced )
2010-09-26 20:48:25 +02:00
{
for ( CreatureTextGroup :: const_iterator iter = tempGroup . begin (); iter != tempGroup . end (); ++ iter )
{
uint32 chance = uint32 (( * iter ). probability );
uint32 r = urand ( 0 , 100 );
2010-09-29 23:26:28 +02:00
offset ++ ;
2010-09-26 20:48:25 +02:00
if ( r <= chance )
2010-10-07 14:00:52 +02:00
break ;
2010-09-26 20:48:25 +02:00
}
}
2010-09-29 23:26:28 +02:00
uint32 pos = 0 ;
if ( isEqualChanced || offset < 0 )
pos = urand ( 0 , count - 1 );
else if ( offset >= 0 )
pos = offset ;
CreatureTextGroup :: const_iterator iter = tempGroup . begin () + pos ;
ChatType finalType = ( msgtype == CHAT_TYPE_END ) ? ( * iter ). type : msgtype ;
Language finalLang = ( language == LANG_ADDON ) ? ( * iter ). lang : language ;
uint32 finalSound = sound ? sound : ( * iter ). sound ;
if ( finalSound )
2010-10-25 18:25:21 +02:00
SendSound ( source , finalSound , finalType , whisperGuid , range , team , gmOnly );
2010-09-29 23:26:28 +02:00
if (( * iter ). emote )
2010-11-05 19:38:43 +01:00
SendEmote ( srcPlr ? srcPlr -> ToUnit () : source , ( * iter ). emote );
2010-09-29 23:26:28 +02:00
2010-11-05 19:38:43 +01:00
SendChatString ( srcPlr ? srcPlr -> ToUnit () : source , ( * iter ). text . c_str (), finalType , finalLang , whisperGuid , range , team , gmOnly );
2010-10-25 18:25:21 +02:00
if ( isEqualChanced || ( ! isEqualChanced && totalChance == 100.0f ))
SetRepeatId ( source , textGroup , ( * iter ). id );
2010-09-29 23:26:28 +02:00
return ( * iter ). duration ;
}
2010-10-25 18:25:21 +02:00
void CreatureTextMgr :: SendSound ( Creature * source , uint32 sound , ChatType msgtype , uint64 whisperGuid , TextRange range , Team team , bool gmOnly )
2010-09-29 23:26:28 +02:00
{
if ( ! sound || ! source )
return ;
WorldPacket data ( SMSG_PLAY_SOUND , 4 );
data << uint32 ( sound );
2010-10-25 18:25:21 +02:00
SendChatPacket ( & data , source , msgtype , whisperGuid , range , team , gmOnly );
2010-09-29 23:26:28 +02:00
}
2010-11-05 19:38:43 +01:00
void CreatureTextMgr :: SendEmote ( Unit * source , uint32 emote )
2010-09-29 23:26:28 +02:00
{
2010-11-05 19:38:43 +01:00
if ( ! source ) return ;
2010-09-29 23:26:28 +02:00
source -> HandleEmoteCommand ( emote );
2010-09-26 20:48:25 +02:00
}
void CreatureTextMgr :: SetRepeatId ( Creature * source , uint8 textGroup , uint8 id )
{
if ( ! source )
return ;
if ( mTextRepeatMap . find ( source -> GetGUID ()) == mTextRepeatMap . end ())
{
CreatureTextRepeatGroup TextGroup ;
mTextRepeatMap [ source -> GetGUID ()] = TextGroup ;
}
if ( mTextRepeatMap [ source -> GetGUID ()]. find ( textGroup ) == mTextRepeatMap [ source -> GetGUID ()]. end ())
{
CreatureTextRepeatIds ids ;
mTextRepeatMap [ source -> GetGUID ()][ textGroup ] = ids ;
}
if ( std :: find ( mTextRepeatMap [ source -> GetGUID ()][ textGroup ]. begin (), mTextRepeatMap [ source -> GetGUID ()][ textGroup ]. end (), id ) == mTextRepeatMap [ source -> GetGUID ()][ textGroup ]. end ())
{
mTextRepeatMap [ source -> GetGUID ()][ textGroup ]. push_back ( id );
}
else
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( "CreatureTextMgr: TextGroup %u for Creature(%s) GuidLow %u Entry %u, id %u already added" , uint32 ( textGroup ), source -> GetName (), source -> GetGUIDLow (), source -> GetEntry (), uint32 ( id ));
2010-09-26 20:48:25 +02:00
}
CreatureTextRepeatIds CreatureTextMgr :: GetRepeatGroup ( Creature * source , uint8 textGroup )
{
ASSERT ( source ); //should never happen
CreatureTextRepeatIds ids ;
CreatureTextRepeatMap :: const_iterator mapItr = mTextRepeatMap . find ( source -> GetGUID ());
if ( mapItr != mTextRepeatMap . end ())
{
CreatureTextRepeatGroup :: const_iterator groupItr = ( * mapItr ). second . find ( textGroup );
if ( groupItr != ( * mapItr ). second . end ())
{
ids = ( * groupItr ). second ;
}
}
return ids ;
}
2010-10-25 18:25:21 +02:00
void CreatureTextMgr :: SendChatString ( WorldObject * source , char const * text , ChatType msgtype , Language language , uint64 whisperGuid , TextRange range , Team team , bool gmOnly ) const
2010-09-26 20:48:25 +02:00
{
if ( ! source )
return ;
2010-09-25 23:52:17 +02:00
WorldPacket data ( SMSG_MESSAGECHAT , 200 );
BuildMonsterChat ( & data , source , msgtype , text , language , whisperGuid ); //build our packet
2010-10-25 18:25:21 +02:00
SendChatPacket ( & data , source , msgtype , whisperGuid , range , team , gmOnly ); //send our packet
2010-09-25 23:52:17 +02:00
}
void CreatureTextMgr :: BuildMonsterChat ( WorldPacket * data , WorldObject * source , ChatType msgtype , char const * text , Language language , uint64 whisperGuid ) const
{
2010-09-26 20:48:25 +02:00
if ( ! source )
return ;
2010-09-25 23:52:17 +02:00
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
{
2010-12-23 23:25:44 +01:00
sLog -> outError ( "CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent CHAT_TYPE_WHISPER with targetGuid 0. Ignoring." , source -> GetName (), uint32 ( source -> GetTypeId ()), source -> GetGUIDLow ());
2010-09-25 23:52:17 +02:00
return ;
}
break ;
case CHAT_TYPE_BOSS_WHISPER :
if ( whisperGuid )
sendType = CHAT_MSG_RAID_BOSS_WHISPER ;
else
{
2010-12-23 23:25:44 +01:00
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 ());
2010-09-25 23:52:17 +02:00
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
2010-10-07 14:00:52 +02:00
if ( whisperGuid && ! IS_PLAYER_GUID ( whisperGuid )) //can only whisper players
2010-09-25 23:52:17 +02:00
{
2010-12-23 23:25:44 +01:00
sLog -> outError ( "CreatureTextMgr: WorldObject(%s) TypeId %u GuidLow %u sent WHISPER msg to Non-Player target. Ignoring." , source -> GetName (), uint32 ( source -> GetTypeId ()), source -> GetGUIDLow ());
2010-09-25 23:52:17 +02:00
return ;
2011-01-16 12:23:17 +01:00
// *data << (uint32)1; // target name length
// *data << (uint8)0; // target name
2010-09-25 23:52:17 +02:00
}
* data << ( uint32 )( strlen ( text ) + 1 );
* data << text ;
* data << ( uint8 ) 0 ; // ChatTag
}
2010-10-25 18:25:21 +02:00
void CreatureTextMgr :: SendChatPacket ( WorldPacket * data , WorldObject * source , ChatType msgtype , uint64 whisperGuid , TextRange range , Team team , bool gmOnly ) const
2010-09-25 23:52:17 +02:00
{
2010-09-26 20:48:25 +02:00
if ( ! source )
return ;
2010-12-23 23:25:44 +01:00
float dist = sWorld -> getFloatConfig ( CONFIG_LISTEN_RANGE_SAY );
2010-10-07 14:00:52 +02:00
2010-09-25 23:52:17 +02:00
switch ( msgtype )
{
case CHAT_TYPE_YELL :
2010-12-23 23:25:44 +01:00
dist = sWorld -> getFloatConfig ( CONFIG_LISTEN_RANGE_YELL );
2010-09-25 23:52:17 +02:00
break ;
case CHAT_TYPE_BOSS_EMOTE :
case CHAT_TYPE_TEXT_EMOTE :
2010-12-23 23:25:44 +01:00
dist = sWorld -> getFloatConfig ( CONFIG_LISTEN_RANGE_TEXTEMOTE );
2010-09-25 23:52:17 +02:00
break ;
case CHAT_TYPE_WHISPER :
case CHAT_TYPE_BOSS_WHISPER :
{
2010-10-25 18:25:21 +02:00
if ( range == TEXT_RANGE_NORMAL ) //ignores team and gmOnly
2010-09-25 23:52:17 +02:00
{
2010-12-22 21:25:23 +01:00
Player * player = sObjectMgr -> GetPlayer ( whisperGuid );
2010-09-29 23:26:28 +02:00
if ( ! player || ! player -> GetSession ())
return ;
player -> GetSession () -> SendPacket ( data );
2010-09-25 23:52:17 +02:00
return ;
}
}
2010-09-29 23:26:28 +02:00
break ;
2010-09-25 23:52:17 +02:00
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 )
2010-10-26 11:40:13 +02:00
if ( itr -> getSource () -> GetAreaId () == areaId && ( ! team || Team ( itr -> getSource () -> GetTeam ()) == team ) && ( ! gmOnly || itr -> getSource () -> isGameMaster ()))
2010-10-25 18:25:21 +02:00
{
if ( data -> GetOpcode () == SMSG_MESSAGECHAT ) //override whisperguid with actual player's guid
data -> put < uint64 > ( 1 + 4 + 8 + 4 + 4 + ( int32 )( strlen ( source -> GetName ()) + 1 ), uint64 ( itr -> getSource () -> GetGUID ()));
2010-09-25 23:52:17 +02:00
( itr -> getSource ()) -> GetSession () -> SendPacket ( data );
2010-10-25 18:25:21 +02:00
}
2010-09-25 23:52:17 +02:00
}
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 )
2010-10-26 11:40:13 +02:00
if ( itr -> getSource () -> GetZoneId () == zoneId && ( ! team || Team ( itr -> getSource () -> GetTeam ()) == team ) && ( ! gmOnly || itr -> getSource () -> isGameMaster ()))
2010-10-25 18:25:21 +02:00
{
if ( data -> GetOpcode () == SMSG_MESSAGECHAT ) //override whisperguid with actual player's guid
data -> put < uint64 > ( 1 + 4 + 8 + 4 + 4 + ( int32 )( strlen ( source -> GetName ()) + 1 ), uint64 ( itr -> getSource () -> GetGUID ()));
2010-09-25 23:52:17 +02:00
( itr -> getSource ()) -> GetSession () -> SendPacket ( data );
2010-10-25 18:25:21 +02:00
}
2010-09-25 23:52:17 +02:00
}
return ;
case TEXT_RANGE_MAP :
{
Map :: PlayerList const & pList = source -> GetMap () -> GetPlayers ();
for ( Map :: PlayerList :: const_iterator itr = pList . begin (); itr != pList . end (); ++ itr )
2010-10-25 18:25:21 +02:00
{
if ( data -> GetOpcode () == SMSG_MESSAGECHAT ) //override whisperguid with actual player's guid
data -> put < uint64 > ( 1 + 4 + 8 + 4 + 4 + ( int32 )( strlen ( source -> GetName ()) + 1 ), uint64 ( itr -> getSource () -> GetGUID ()));
2010-10-26 11:40:13 +02:00
if (( ! team || Team ( itr -> getSource () -> GetTeam ()) == team ) && ( ! gmOnly || itr -> getSource () -> isGameMaster ()))
2010-09-25 23:52:17 +02:00
( itr -> getSource ()) -> GetSession () -> SendPacket ( data );
2010-10-25 18:25:21 +02:00
}
2010-09-25 23:52:17 +02:00
}
return ;
case TEXT_RANGE_WORLD :
{
2010-12-23 23:25:44 +01:00
const SessionMap smap = sWorld -> GetAllSessions ();
2010-10-25 18:25:21 +02:00
for ( SessionMap :: const_iterator iter = smap . begin (); iter != smap . end (); ++ iter )
{
if ( Player * plr = ( * iter ). second -> GetPlayer ())
{
if ( data -> GetOpcode () == SMSG_MESSAGECHAT ) //override whisperguid with actual player's guid
data -> put < uint64 > ( 1 + 4 + 8 + 4 + 4 + ( int32 )( strlen ( source -> GetName ()) + 1 ), uint64 ( plr -> GetGUID ()));
2010-10-26 11:40:13 +02:00
if ( plr -> GetSession () && ( ! team || Team ( plr -> GetTeam ()) == team ) && ( ! gmOnly || plr -> isGameMaster ()))
2010-10-25 18:25:21 +02:00
plr -> GetSession () -> SendPacket ( data );
}
}
2010-09-25 23:52:17 +02:00
}
return ;
case TEXT_RANGE_NORMAL :
default :
break ;
}
source -> SendMessageToSetInRange ( data , dist , true );
}
2010-10-25 18:25:21 +02:00
bool CreatureTextMgr :: TextExist ( uint32 sourceEntry , uint8 textGroup )
{
if ( ! sourceEntry )
return false ;
CreatureTextMap :: const_iterator sList = mTextMap . find ( sourceEntry );
if ( sList == mTextMap . end ())
{
2010-12-23 23:25:44 +01:00
sLog -> outDebug ( "CreatureTextMgr::TextExist: Could not find Text for Creature (entry %u) in 'creature_text' table." , sourceEntry );
2010-10-25 18:25:21 +02:00
return false ;
}
CreatureTextHolder TextHolder = ( * sList ). second ;
CreatureTextHolder :: const_iterator itr = TextHolder . find ( textGroup );
if ( itr == TextHolder . end ())
{
2010-12-23 23:25:44 +01:00
sLog -> outDebug ( "CreatureTextMgr::TextExist: Could not find TextGroup %u for Creature (entry %u)." , uint32 ( textGroup ), sourceEntry );
2010-10-25 18:25:21 +02:00
return false ;
}
return true ;
2010-10-26 11:40:13 +02:00
}