⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chat.cpp.svn-base

📁 絲路server源碼 Silk Road server source
💻 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 + -