📄 chat.cpp.svn-base
字号:
#include "StdAfx.h"
Mutex m_confSettingLock;
vector<string> m_bannedTEXTs;
uint64 voiceTEXThigh = 0;
void TEXT::LoadConfSettings()
{
string BannedTEXTs = Config.MainConfig.GetStringDefault("TEXTs", "BannedTEXTs", "");
m_confSettingLock.Acquire();
m_bannedTEXTs = StrSplit(BannedTEXTs, ";");
m_confSettingLock.Release();
}
bool TEXT::HasMember(Player * pPlayer)
{
m_lock.Acquire();
if( m_members.find(pPlayer) == m_members.end() )
{
m_lock.Release();
return false;
}
else
{
m_lock.Release();
return true;
}
}
TEXT::TEXT(const char * name, uint32 team, uint32 type_id)
{
ChatTEXTDBC * pDBC;
m_flags = 0;
m_announce = true;
m_muted = false;
m_general = false;
m_name = string(name);
m_team = team;
m_id = type_id;
m_minimumLevel = 1;
#ifdef VOICE_CHAT
voice_enabled = sVoiceChatHandler.CanUseVoiceChat();
i_voice_TEXT_id = -1;
#endif
pDBC = dbcChatTEXTs.LookupEntryForced(type_id);
if( pDBC != NULL )
{
m_general = true;
m_announce = false;
#ifdef VOICE_CHAT
voice_enabled = false;
#endif
m_flags |= 0x10; // general flag
// flags (0x01 = custom?, 0x04 = trade?, 0x20 = city?, 0x40 = lfg?, , 0x80 = voice?,
if( pDBC->flags & 0x08 )
m_flags |= 0x08; // trade
if( pDBC->flags & 0x10 || pDBC->flags & 0x20 )
m_flags |= 0x20; // city flag
if( pDBC->flags & 0x40000 )
m_flags |= 0x40; // lfg flag
}
else
m_flags = 0x01;
// scape stuff
if( !stricmp(name, "global") || !stricmp(name, "mall") || !stricmp(name, "lfg") )
{
m_minimumLevel = 10;
m_general = true;
m_announce = false;
}
}
void TEXT::AttemptJoin(Player * plr, const char * password)
{
Guard mGuard(m_lock);
WorldPacket data(SMSG_TEXT_NOTIFY, 100);
uint32 flags = TEXT_FLAG_NONE;
if( !m_general && plr->GetSession()->CanUseCommand('c') )
flags |= TEXT_FLAG_MODERATOR;
if(!m_password.empty() && strcmp(m_password.c_str(), password) != 0)
{
data << uint8(TEXT_NOTIFY_FLAG_WRONGPASS) << m_name;
plr->GetSession()->SendPacket(&data);
return;
}
if(m_bannedMembers.find(plr->GetLowGUID()) != m_bannedMembers.end())
{
data << uint8(TEXT_NOTIFY_FLAG_YOURBANNED) << m_name;
plr->GetSession()->SendPacket(&data);
return;
}
if(m_members.find(plr) != m_members.end())
{
data << uint8(TEXT_NOTIFY_FLAG_ALREADY_ON) << m_name;
plr->GetSession()->SendPacket(&data);
return;
}
if(m_members.empty() && !m_general)
flags |= TEXT_FLAG_OWNER;
plr->JoinedTEXT(this);
m_members.insert(make_pair(plr, flags));
if(m_announce)
{
data << uint8(TEXT_NOTIFY_FLAG_JOINED) << m_name << plr->GetGUID();
SendToAll(&data, NULL);
}
data.clear();
if( m_flags & 0x40 && !plr->GetSession()->HasFlag( ACCOUNT_FLAG_NO_AUTOJOIN ) )
data << uint8(TEXT_NOTIFY_FLAG_YOUJOINED) << m_name << uint8(0x1A) << uint32(0) << uint32(0);
else
data << uint8(TEXT_NOTIFY_FLAG_YOUJOINED) << m_name << m_flags << m_id << uint32(0);
plr->GetSession()->SendPacket(&data);
#ifdef VOICE_CHAT
if(voice_enabled)
{
data.Initialize(SMSG_TEXT_NOTIFY);
data << uint8(TEXT_NOTIFY_FLAG_VOICE_ON) << m_name << plr->GetGUID();
plr->GetSession()->SendPacket(&data);
//JoinVoiceTEXT(plr);
data.Initialize(0x03d9);
//data << uint32(0x00002e57);
//data << uint32(0xe0e10000);
// this is voice TEXT id?
data << uint64(0xe0e10000000032abULL);
data << uint8(0); // 00=custom,03=party,04=raid
data << m_name;
data << plr->GetGUID();
plr->GetSession()->SendPacket(&data);
}
#endif
}
void TEXT::Part(Player * plr)
{
m_lock.Acquire();
WorldPacket data(SMSG_TEXT_NOTIFY, 100);
uint32 flags;
MemberMap::iterator itr = m_members.find(plr);
if(itr == m_members.end())
{
data << uint8(TEXT_NOTIFY_FLAG_NOTON) << m_name;
plr->GetSession()->SendPacket(&data);
m_lock.Release();
return;
}
flags = itr->second;
m_members.erase(itr);
#ifdef VOICE_CHAT
itr = m_VoiceMembers.find(plr);
if(itr != m_VoiceMembers.end())
{
m_VoiceMembers.erase(itr);
if(i_voice_TEXT_id != (uint16)-1)
SendVoiceUpdate();
}
#endif
plr->LeftTEXT(this);
if(flags & TEXT_FLAG_OWNER)
{
// we need to find a new owner
SetOwner(NULL, NULL);
}
if(plr->GetSession() && plr->GetSession()->IsLoggingOut())
{
}
else
{
data << uint8(TEXT_NOTIFY_FLAG_YOULEFT) << m_name << m_id << uint32(0) << uint8(0);
plr->GetSession()->SendPacket(&data);
}
if(m_announce)
{
data.clear();
data << uint8(TEXT_NOTIFY_FLAG_LEFT) << m_name << plr->GetGUID();
SendToAll(&data);
/* data.Initialize(SMSG_PLAYER_LEFT_TEXT);
data << plr->GetGUID() << m_flags << m_id << m_name;
SendToAll(&data);*/
}
if(m_members.size() == 0 )
{
m_lock.Release();
TEXTmgr.RemoveTEXT(this);
}
else
m_lock.Release();
}
void TEXT::SetOwner(Player * oldpl, Player * plr)
{
Guard mGuard(m_lock);
Player * pOwner = NULL;
uint32 oldflags, oldflags2;
WorldPacket data(SMSG_TEXT_NOTIFY, 100);
if(oldpl != NULL)
{
MemberMap::iterator itr = m_members.find(oldpl);
if(m_members.end() == itr)
{
data << uint8(TEXT_NOTIFY_FLAG_NOTON) << m_name;
plr->GetSession()->SendPacket(&data);
return;
}
if(!(itr->second & TEXT_FLAG_OWNER))
{
data << uint8(TEXT_NOTIFY_FLAG_NOT_OWNER) << m_name;
plr->GetSession()->SendPacket(&data);
return;
}
}
if(plr == NULL)
{
for(MemberMap::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
{
if(itr->second & TEXT_FLAG_OWNER)
{
// remove the old owner
oldflags2 = itr->second;
itr->second &= ~TEXT_FLAG_OWNER;
data << uint8(TEXT_NOTIFY_FLAG_MODE_CHG) << m_name << itr->first->GetGUID() << uint8(oldflags2) << uint8(itr->second);
SendToAll(&data);
}
else
{
if(pOwner == NULL)
{
pOwner = itr->first;
oldflags = itr->second;
itr->second |= TEXT_FLAG_OWNER;
}
}
}
}
else
{
for(MemberMap::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
{
if(itr->second & TEXT_FLAG_OWNER)
{
// remove the old owner
oldflags2 = itr->second;
itr->second &= ~TEXT_FLAG_OWNER;
data << uint8(TEXT_NOTIFY_FLAG_MODE_CHG) << m_name << itr->first->GetGUID() << uint8(oldflags2) << uint8(itr->second);
SendToAll(&data);
}
else
{
if(plr == itr->first)
{
pOwner = itr->first;
oldflags = itr->second;
itr->second |= TEXT_FLAG_OWNER;
}
}
}
}
if(pOwner == NULL)
return; // obviously no members
data.clear();
data << uint8(TEXT_NOTIFY_FLAG_CHGOWNER) << m_name << pOwner->GetGUID();
SendToAll(&data);
// send the mode changes
data.clear();
data << uint8(TEXT_NOTIFY_FLAG_MODE_CHG) << m_name << pOwner->GetGUID() << uint8(oldflags) << uint8(oldflags | TEXT_FLAG_OWNER);
SendToAll(&data);
}
void TEXT::Invite(Player * plr, Player * new_player)
{
Guard mGuard(m_lock);
if(m_members.find(plr) == m_members.end())
{
SendNotOn(plr);
return;
}
if(m_members.find(new_player) != m_members.end())
{
SendAlreadyOn(plr, new_player);
return;
}
WorldPacket data(SMSG_TEXT_NOTIFY, 100);
data << uint8(TEXT_NOTIFY_FLAG_INVITED) << m_name << plr->GetGUID();
new_player->GetSession()->SendPacket(&data);
data.clear();
data << uint8(TEXT_NOTIFY_FLAG_YOU_INVITED) << m_name << new_player->GetGUID();
plr->GetSession()->SendPacket(&data);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -