示例#1
0
bool ChatHandler::HandleGMTicketListCommand(const char* args, WorldSession *m_session)
{
	Player *cplr = m_session->GetPlayer();

	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	chn->Say(cplr, "GmTicket 2", cplr, true);

	for(GmTicketList::iterator itr = objmgr.GM_TicketList.begin(); itr != objmgr.GM_TicketList.end(); itr++)
	{
		if((*itr)->deleted)
			continue;

		Player* plr = objmgr.GetPlayer((uint32)(*itr)->playerGuid);

		if( plr == NULL )
			continue;

//		Player* aplr = ((*itr)->assignedToPlayer == 0 ? NULL : objmgr.GetPlayer((uint32)(*itr)->assignedToPlayer));

		std::stringstream ss;

		uint32 zone = 0;
		if(plr->IsInWorld())
		{
			zone = plr->GetZoneId();
		}
		ss << "GmTicket 0," << (*itr)->name << "," << (*itr)->level << ",0," << zone;
		chn->Say(cplr, ss.str().c_str(), cplr, true);
	}

	return true;
}
示例#2
0
bool ChatHandler::HandleGMTicketGetByIdCommand(const char* args, WorldSession *m_session)
{
	uint64 ticketGuid = (args ? atoi(args) : 0);
	if(!ticketGuid)
	{
		RedSystemMessage(m_session, "You must specify a ticket id.");
		return true;
	}
	
	Player *cplr = m_session->GetPlayer();
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;
	
	GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid);
	if(ticket == NULL || ticket->deleted)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not found.", cplr, true);
		return true;
	}

	char* msg = new char[ticket->message.size() + 1];
	strcpy(msg, ticket->message.c_str());
	char * start = msg, *end;
	bool firstLine = true;
	for(;;)
	{
		end = strchr(start, '\n');
		if(!end)
			break;
	
		*end = '\0';

		std::stringstream ss;
		ss << "GmTicket:" << (firstLine ? GM_TICKET_CHAT_OPCODE_CONTENT : GM_TICKET_CHAT_OPCODE_APPENDCONTENT);
		ss << ":" << ticket->guid;
		ss << ":" << start;
		chn->Say(cplr, ss.str().c_str(), cplr, true);

		firstLine = false;

		start = end + 1;
	}
	if(*start != '\0')
	{
		std::stringstream ss;
		ss << "GmTicket:" << (firstLine ? GM_TICKET_CHAT_OPCODE_CONTENT : GM_TICKET_CHAT_OPCODE_APPENDCONTENT);
		ss << ":" << ticket->guid;
		ss << ":" << start;
		chn->Say(cplr, ss.str().c_str(), cplr, true);
	}
	delete[] msg;

	return true;
}
示例#3
0
bool ChatHandler::HandleGMTicketDeletePermanentCommand(const char* args, WorldSession* m_session)
{
	uint64 ticketGuid = (args ? atoi(args) : 0);
	if(!ticketGuid)
	{
		RedSystemMessage(m_session, "You must specify a ticket id.");
		return true;
	}

	Player* cplr = m_session->GetPlayer();
	Channel* chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	GM_Ticket* ticket = objmgr.GetGMTicket(ticketGuid);
	if(ticket == NULL)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not found.", cplr, true);
		return true;
	}

	Player* plr = NULL;

	if(!ticket->deleted)
	{
		plr = objmgr.GetPlayer((uint32)ticket->playerGuid);

		std::stringstream ss;
		ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_REMOVED;
		ss << ":" << ticket->guid;
		chn->Say(cplr, ss.str().c_str(), NULL, true);

		objmgr.RemoveGMTicket(ticket->guid);
	}

	objmgr.DeleteGMTicketPermanently(ticket->guid);
	ticket = NULL;
	if(plr != NULL && plr->IsInWorld())
	{
		// Notify player about removing ticket
		WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
		data << uint32(9);
		plr->GetSession()->SendPacket(&data);

		// Response - Send GM Survey
		WorldPacket datab(SMSG_GM_TICKET_STATUS_UPDATE, 1);
		datab << uint32(3);
		plr->GetSession()->SendPacket(&datab);
		//plr->GetSession()->GetPlayer()->OutPacketToSet( SMSG_GM_TICKET_STATUS_UPDATE, 1, SENDSURVEY,true);
		SystemMessageToPlr(plr, "You have been selected to fill out a GM Performance Survey. Please respond truthfully to the questions that you are asked and include the Game Masters name to your comment.");
	}

	return true;
}
示例#4
0
bool ChatHandler::HandleGMTicketCommentCommand(const char* args, WorldSession *m_session)
{
	uint64 ticketGuid;
	int argc = 1;
	char* comment = NULL;
	char* guidString = (char*)args;

	// Parse arguments
	char* space = (char*)strchr(args, ' ');
	if(space)
	{	
		*space = '\0';
		comment = space + 1;
		argc = 2;
	}

	ticketGuid = atoi(guidString);
	if(!ticketGuid)
	{
		RedSystemMessage(m_session, "You must specify a ticket id.");
		return true;
	}

	Player *cplr = m_session->GetPlayer();
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid);
	if(ticket == NULL || ticket->deleted)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not found.", cplr, true);
		return true;
	}

	if(ticket->assignedToPlayer != 0 && ticket->assignedToPlayer != cplr->GetGUID() && !cplr->GetSession()->CanUseCommand('z'))
	{
		chn->Say(cplr, "GmTicket:0:Ticket is assigned to another GM.", cplr, true);
		return true;
	}

	ticket->comment = (argc == 1 ? "" : comment);
	objmgr.UpdateGMTicket(ticket);

	std::stringstream ss;
	ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_COMMENT;
	ss << ":" << ticket->guid;
	ss << ":" << cplr->GetName();
	ss << ":" << ticket->comment;
	chn->Say(cplr, ss.str().c_str(), NULL, true);

	return true;
}
示例#5
0
bool ChatHandler::HandleGMTicketGetByIdCommand(const char* args, WorldSession *m_session)
{
	if(!*args)
		return false;
	
	Player *cplr = m_session->GetPlayer();
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;
	
	Player *plr = objmgr.GetPlayer(args, false);
	if(plr == NULL)
	{
		RedSystemMessage(m_session, "Player not found.");
		return true;
	}
	GM_Ticket *ticket = objmgr.GetGMTicketByPlayer(plr->GetGUID());
	if(ticket == NULL || ticket->deleted)
	{
		RedSystemMessage(m_session, "Ticket not found.");
		return true;
	}

	char* msg = new char[ticket->message.size() + 1];
	strcpy(msg, ticket->message.c_str());
	char * start = msg, *end;
	bool firstLine = true;
	for(;;)
	{
		end = strchr(start, '\n');
		if(!end)
			break;
	
		*end = '\0';

		std::stringstream ss;
		ss << "GmTicket " << (firstLine ? "3" : "4") << "," << ticket->name << "," << start;
		chn->Say(cplr, ss.str().c_str(), cplr, true);

		firstLine = false;

		start = end + 1;
	}
	if(*start != '\0')
	{
		std::stringstream ss;
		ss << "GmTicket " << (firstLine ? "3" : "4") << "," << ticket->name << "," << start;
		chn->Say(cplr, ss.str().c_str(), cplr, true);
	}
	delete[] msg;

	return true;
}
示例#6
0
bool ChatHandler::HandleGMTicketRemoveByIdCommand(const char* args, WorldSession *m_session)
{
	uint64 ticketGuid = (args ? atoi(args) : 0);
	if(!ticketGuid)
	{
		RedSystemMessage(m_session, "You must specify a ticket id.");
		return true;
	}

	Player *cplr = m_session->GetPlayer();
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid);
	if(ticket == NULL || ticket->deleted)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not found.", cplr, true);
		return true;
	}

	if(ticket->assignedToPlayer != 0 && ticket->assignedToPlayer != cplr->GetGUID() && !cplr->GetSession()->CanUseCommand('z'))
	{
		chn->Say(cplr, "GmTicket:0:Ticket is assigned to another GM.", cplr, true);
		return true;
	}

	Player* plr = objmgr.GetPlayer((uint32)ticket->playerGuid);

	std::stringstream ss;
	ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_REMOVED;
	ss << ":" << ticket->guid;
	chn->Say(cplr, ss.str().c_str(), NULL, true);

	objmgr.RemoveGMTicket(ticket->guid);

	if(!plr)
		return true;
	if(!plr->IsInWorld())
		return true;

	// Notify player about removing ticket
	WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
	data << uint32(9);
	plr->GetSession()->SendPacket( &data );

	return true;
}
示例#7
0
文件: GMTicket.cpp 项目: vata/wowice
void WorldSession::HandleGMTicketCreateOpcode(WorldPacket & recv_data)
{
	CHECK_INWORLD_RETURN

	uint32 map;
	float x, y, z;
	std::string message = "";
	std::string message2 = "";
	GM_Ticket *ticket = new GM_Ticket;
	WorldPacket data(SMSG_GMTICKET_CREATE, 4);

	// recv Data
	recv_data >> map;
	recv_data >> x;
	recv_data >> y;
	recv_data >> z;
	recv_data >> message;
	recv_data >> message2;

	// Remove pending tickets
	objmgr.RemoveGMTicketByPlayer(GetPlayer()->GetGUID());

	ticket->guid = uint64( objmgr.GenerateTicketID() );
	ticket->playerGuid = GetPlayer()->GetGUID();
	ticket->map = map;
	ticket->posX = x;
	ticket->posY = y;
	ticket->posZ = z;
	ticket->message = message;
	ticket->timestamp = (uint32)UNIXTIME;
	ticket->name = GetPlayer()->GetName();
	ticket->level = GetPlayer()->getLevel();
	ticket->deleted = false;
	ticket->assignedToPlayer = 0;
	ticket->comment = "";

	// Add a new one
	objmgr.AddGMTicket(ticket, false);

	// Response - no errors
	data << uint32(2);

	SendPacket(&data);

	// send message indicating new ticket
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(),GetPlayer());
	if(chn)
	{
		std::stringstream ss;
#ifdef GM_TICKET_MY_MASTER_COMPATIBLE
		ss << "GmTicket 5, " << ticket->name;
#else
		ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_NEWTICKET;
		ss << ":" << ticket->guid;
		ss << ":" << ticket->level;
		ss << ":" << ticket->name;
#endif
		chn->Say(_player, ss.str().c_str(), NULL, true);
	}
}
示例#8
0
文件: GMTicket.cpp 项目: vata/wowice
void WorldSession::HandleGMTicketDeleteOpcode(WorldPacket & recv_data)
{
	CHECK_INWORLD_RETURN

	GM_Ticket* ticket = objmgr.GetGMTicketByPlayer(GetPlayer()->GetGUID());

	// Remove Tickets from Player
	objmgr.RemoveGMTicketByPlayer(GetPlayer()->GetGUID());

	// Response - no errors
	WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
	data << uint32(9);
	SendPacket(&data);

	// send message to gm_sync_chan
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), GetPlayer());
	if(chn && ticket != NULL)
	{
		std::stringstream ss;
#ifdef GM_TICKET_MY_MASTER_COMPATIBLE
		ss << "GmTicket 1," << ticket->name;
#else
		ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_REMOVED;
		ss << ":" << ticket->guid;
#endif
		chn->Say(_player, ss.str().c_str(), NULL, true);
	}
}
示例#9
0
bool ChatHandler::HandleGMTicketReleaseCommand(const char* args, WorldSession *m_session)
{
	uint64 ticketGuid = (args ? atoi(args) : 0);
	if(!ticketGuid)
	{
		RedSystemMessage(m_session, "You must specify a ticket id.");
		return true;
	}

	Player *cplr = m_session->GetPlayer();
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid);
	if(ticket == NULL || ticket->deleted)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not found.", cplr, true);
		return true;
	}

	if(ticket->assignedToPlayer == 0)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not assigned to a GM.", cplr, true);
		return true;
	}

	Player *plr = objmgr.GetPlayer((uint32)ticket->assignedToPlayer);
	if(!cplr->GetSession()->CanUseCommand('z') && plr != NULL && plr->IsInWorld() && plr->GetSession()->CanUseCommand('z'))
	{
		chn->Say(cplr, "GmTicket:0:You can not release tickets from admins.", cplr, true);
		return true;
	}
	
	ticket->assignedToPlayer = 0;
	objmgr.UpdateGMTicket(ticket);

	std::stringstream ss;
	ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_RELEASED;
	ss << ":" << ticket->guid;
	chn->Say(cplr, ss.str().c_str(), NULL, true);

	return true;
}
示例#10
0
bool ChatHandler::HandleGMTicketListCommand(const char* args, WorldSession *m_session)
{
	Player *cplr = m_session->GetPlayer();

	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	std::stringstream ss0;
	ss0 << "GmTicket:" << GM_TICKET_CHAT_OPCODE_LISTSTART;
	chn->Say(cplr, ss0.str().c_str(), cplr, true);

	for(GmTicketList::iterator itr = objmgr.GM_TicketList.begin(); itr != objmgr.GM_TicketList.end(); itr++)
	{
		if((*itr)->deleted)
			continue;

		Player* plr = objmgr.GetPlayer((uint32)(*itr)->playerGuid);
		
		Player* aplr = NULL;
		PlayerInfo* aplri = NULL;
		if((*itr)->assignedToPlayer != 0)
		{
			aplr = objmgr.GetPlayer((uint32)(*itr)->assignedToPlayer);
			if(aplr == NULL)
				aplri = objmgr.GetPlayerInfo((uint32)(*itr)->assignedToPlayer);
		}

		std::stringstream ss;
		ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_LISTENTRY;
		ss << ":" << (*itr)->guid;
		ss << ":" << (plr == NULL ? (*itr)->level : plr->getLevel());
		ss << ":" << (plr == NULL ? 0 : plr->IsInWorld());
		ss << ":" << (aplr == NULL ? (aplri == NULL ? "" : aplri->name) : aplr->GetName());
		ss << ":" << (plr == NULL ? (*itr)->name : plr->GetName());
		ss << ":" << (*itr)->comment;
		chn->Say(cplr, ss.str().c_str(), cplr, true);
	}

	return true;
}
示例#11
0
bool ChatHandler::HandleGMTicketRemoveByIdCommand(const char* args, WorldSession* m_session)
{
	if(!*args)
		return false;

	Player* cplr = m_session->GetPlayer();
	Channel* chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	Player* plr = objmgr.GetPlayer(args, true);
	if(plr == NULL)
	{
		RedSystemMessage(m_session, "Player not found.");
		return true;
	}
	GM_Ticket* ticket = objmgr.GetGMTicketByPlayer(plr->GetGUID());
	if(ticket == NULL || ticket->deleted)
	{
		RedSystemMessage(m_session, "Ticket not found.");
		return true;
	}

	std::stringstream ss;
	ss << "GmTicket 1," << ticket->name;
	chn->Say(cplr, ss.str().c_str(), NULL, true);

	objmgr.RemoveGMTicket(ticket->guid);

	if(!plr)
		return true;
	if(!plr->IsInWorld())
		return true;

	// Notify player about removing ticket
	WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
	data << uint32(9);
	plr->GetSession()->SendPacket(&data);
	// Response - Send GM Survey
	WorldPacket datab(SMSG_GM_TICKET_STATUS_UPDATE, 1);
	datab << uint32(3);
	plr->GetSession()->SendPacket(&datab);

	return true;
}
示例#12
0
文件: GMTicket.cpp 项目: vata/wowice
void WorldSession::HandleGMTicketUpdateOpcode(WorldPacket & recv_data)
{
	CHECK_INWORLD_RETURN

	std::string message = "";
	WorldPacket data(SMSG_GMTICKET_UPDATETEXT, 4);

	// recv Data
	recv_data >> message;

	// Update Ticket
	GM_Ticket *ticket = objmgr.GetGMTicketByPlayer(GetPlayer()->GetGUID());
	if(!ticket) // Player doesn't have a GM Ticket yet
	{
		// Response - error couldn't find existing Ticket
		data << uint32(1);

		SendPacket(&data);
		return;
	}
	ticket->message = message;
	ticket->timestamp = (uint32)UNIXTIME;

	objmgr.UpdateGMTicket(ticket);

	// Response - no errors
	data << uint32(2);

	SendPacket(&data);

#ifndef GM_TICKET_MY_MASTER_COMPATIBLE
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(),GetPlayer());
	if(chn)
	{
		std::stringstream ss;
		ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_UPDATED;
		ss << ":" << ticket->guid;
		chn->Say(_player, ss.str().c_str(), NULL, true);
	}
#endif
}
示例#13
0
void WorldSession::HandleGMTicketCreateOpcode(WorldPacket & recv_data)
{
	uint32 type;
	float x, y, z;
	std::string message = "";
	std::string message2 = "";
	GM_Ticket *ticket = new GM_Ticket;
	WorldPacket data(SMSG_GMTICKET_CREATE, 4);

	// recv Data
	recv_data >> type;
	recv_data >> x;
	recv_data >> y;
	recv_data >> z;
	recv_data >> message;
	recv_data >> message2;

	// Create new Ticket and store it
	objmgr.remGMTicket(GetPlayer()->GetGUID());

	ticket->guid = GetPlayer()->GetGUID();
	ticket->type = type;
	ticket->posX = x;
	ticket->posY = y;
	ticket->posZ = z;
	ticket->message = message;
	ticket->timestamp = (uint32)UNIXTIME;
	ticket->name = GetPlayer()->GetName();
	ticket->level = GetPlayer()->getLevel();

	objmgr.remGMTicket(GetPlayer()->GetGUID());
	objmgr.AddGMTicket(ticket,false);

	// Response - no errors
	data << uint32(2);

	SendPacket(&data);

#ifdef CLUSTERING 
	std::stringstream str;
	str << "GmTicket 5," << GetPlayer()->GetName();
	string strmessage = str.str();
	WorldPacket data2(ICMSG_CHANNEL_ACTION, 1 + sWorld.getGmClientChannel().size() + 4 + strmessage.size() + 4 + 1);
	data2 << uint8(CHANNEL_SAY);
	data2 << sWorld.getGmClientChannel();
	data2 << GetPlayer()->GetLowGUID();
	data2 << strmessage;
	data2 << uint32(NULL);
	data2 << bool(true);
	sClusterInterface.SendPacket(&data2);
#else

	// send message indicating new ticket
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(),GetPlayer());
	if(chn)
	{
		char msg[100];
		snprintf(msg, 100, "GmTicket 5,%s", GetPlayer()->GetName());
		chn->Say(_player, msg, NULL, true);
	}
#endif
}
示例#14
0
void WorldSession::HandleGMTicketCreateOpcode(WorldPacket & recv_data)
{
    uint32 type;
    uint8 unk1;
    float x, y, z;
    std::string message = "";
    std::string message2 = "";
    GM_Ticket *ticket = new GM_Ticket;
    WorldPacket data(SMSG_GMTICKET_CREATE, 4);

    // recv Data
    recv_data >> type;
    recv_data >> unk1;
    recv_data >> x;
    recv_data >> y;
    recv_data >> z;
    recv_data >> message;
    recv_data >> message2;

    /*if (type == GM_TICKET_TYPE_BEHAVIOR_HARASSMENT)
    {
    	// more magic
    	uint32 unk1;
    	uint32 unk2;
    	uint32 unk3;
    	string unk4;
    	recv_data >> unk1; // count of something
    	for (int i = 0; i < unk1; i++)
    	{
    		recv_data >> unk2
    		// do something with unk2
    	}
    	recv_data >> unk3;
    	if (unk3)
    		recv_data >> unk4;
    }*/

    // Create new Ticket and store it
    objmgr.remGMTicket(GetPlayer()->GetGUID());

    ticket->guid = GetPlayer()->GetGUID();
    ticket->type = type;
    ticket->posX = x;
    ticket->posY = y;
    ticket->posZ = z;
    ticket->message = message;
    ticket->timestamp = (uint32)UNIXTIME;
    ticket->name = GetPlayer()->GetName();
    ticket->level = GetPlayer()->getLevel();

    objmgr.remGMTicket(GetPlayer()->GetGUID());
    objmgr.AddGMTicket(ticket,false);

    // Response - no errors
    data << uint32(2);

    SendPacket(&data);

    // send message indicating new ticket
    Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(),GetPlayer());
    if(chn)
    {
        char msg[100];
        snprintf(msg, 100, "GmTicket 5,%s", GetPlayer()->GetName());
        chn->Say(_player, msg, NULL, true);
    }
}
示例#15
0
void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
{
	CHECK_INWORLD_RETURN

	CHECK_PACKET_SIZE(recv_data, 9);
	WorldPacket* data = NULL;

	uint32 type;
	int32 lang;

	const char* pMisc = NULL;
	const char* pMsg = NULL;
	recv_data >> type;
	recv_data >> lang;

	if(lang >= NUM_LANGUAGES)
		return;

	if(GetPlayer()->IsBanned())
	{
		GetPlayer()->BroadcastMessage("You cannot do that when banned.");
		return;
	}

	// Flood protection
	if(lang != -1 && !GetPermissionCount() && sWorld.flood_lines != 0)
	{
		/* flood detection, wheeee! */
		if(UNIXTIME >= floodTime)
		{
			floodLines = 0;
			floodTime = UNIXTIME + sWorld.flood_seconds;
		}

		if((++floodLines) > sWorld.flood_lines)
		{
			if(sWorld.flood_message)
				_player->BroadcastMessage("Your message has triggered serverside flood protection. You can speak again in %u seconds.", floodTime - UNIXTIME);

			return;
		}
	}

	switch(type)
	{
		case CHAT_MSG_EMOTE:
		case CHAT_MSG_SAY:
		case CHAT_MSG_YELL:
		case CHAT_MSG_WHISPER:
		case CHAT_MSG_CHANNEL:
			{
				if(m_muted && m_muted >= (uint32)UNIXTIME)
				{
					SystemMessage("Your voice is currently muted by a moderator.");
					return;
				}
			}
			break;
	}

	std::string msg, to = "", channel = "", tmp;
	msg.reserve(256);

	// Process packet
	switch(type)
	{
		case CHAT_MSG_SAY:
		case CHAT_MSG_EMOTE:
		case CHAT_MSG_PARTY:
		case CHAT_MSG_PARTY_LEADER:
		case CHAT_MSG_RAID:
		case CHAT_MSG_RAID_LEADER:
		case CHAT_MSG_RAID_WARNING:
		case CHAT_MSG_GUILD:
		case CHAT_MSG_OFFICER:
		case CHAT_MSG_YELL:
			recv_data >> msg;
			pMsg = msg.c_str();
			//g_chatFilter->ParseEscapeCodes((char*)pMsg,true);
			pMisc = 0;
			break;
		case CHAT_MSG_WHISPER:
			recv_data >> to >> msg;
			pMsg = msg.c_str();
			pMisc = to.c_str();
			break;
		case CHAT_MSG_CHANNEL:
			recv_data >> channel;
			recv_data >> msg;
			pMsg = msg.c_str();
			pMisc = channel.c_str();
			break;
		case CHAT_MSG_AFK:
		case CHAT_MSG_DND:
			break;
		case CHAT_MSG_BATTLEGROUND:
		case CHAT_MSG_BATTLEGROUND_LEADER:
			recv_data >> msg;
			pMsg = msg.c_str();
			break;
		default:
			LOG_ERROR("CHAT: unknown msg type %u, lang: %u", type, lang);
	}


	if(int(msg.find("|T")) > -1)
	{
		GetPlayer()->BroadcastMessage("Don't even THINK about doing that again");
		return;
	}

	// HookInterface OnChat event
	if(pMsg && !sHookInterface.OnChat(_player, type, lang, pMsg, pMisc))
		return;

	Channel* chn = NULL;
	// Main chat message processing
	switch(type)
	{
		case CHAT_MSG_EMOTE:
			{
				if(sWorld.interfaction_chat && lang > 0)
					lang = 0;

				if(g_chatFilter->Parse(msg))
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				if(GetPlayer()->m_modlanguage >= 0)
					data = sChatHandler.FillMessageData(CHAT_MSG_EMOTE, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
				else if(lang == 0 && sWorld.interfaction_chat)
					data = sChatHandler.FillMessageData(CHAT_MSG_EMOTE, CanUseCommand('0') ? LANG_UNIVERSAL : lang,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
				else
					data = sChatHandler.FillMessageData(CHAT_MSG_EMOTE, CanUseCommand('c') ? LANG_UNIVERSAL : lang,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);

				GetPlayer()->SendMessageToSet(data, true, ! sWorld.interfaction_chat);

				//sLog.outString("[emote] %s: %s", _player->GetName(), msg.c_str());
				delete data;

			}
			break;
		case CHAT_MSG_SAY:
			{
				if(sWorld.interfaction_chat && lang > 0)
					lang = 0;

				if(sChatHandler.ParseCommands(msg.c_str(), this) > 0)
					break;

				if(g_chatFilter->Parse(msg))
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				if(GetPlayer()->m_modlanguage >= 0)
				{
					data = sChatHandler.FillMessageData(CHAT_MSG_SAY, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
					GetPlayer()->SendMessageToSet(data, true);
				}
				else
				{
					if(lang > 0 && LanguageSkills[lang] && ! _player->_HasSkillLine(LanguageSkills[lang]))
						return;

					if(lang == 0 && ! CanUseCommand('c') && ! sWorld.interfaction_chat)
						return;

					data = sChatHandler.FillMessageData(CHAT_MSG_SAY, lang, msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);

					GetPlayer()->SendMessageToSet(data, true);
				}
				delete data;

			}
			break;
		case CHAT_MSG_PARTY:
		case CHAT_MSG_PARTY_LEADER:
		case CHAT_MSG_RAID:
		case CHAT_MSG_RAID_LEADER:
		case CHAT_MSG_RAID_WARNING:
			{
				if(sChatHandler.ParseCommands(msg.c_str(), this) > 0)
					break;

				if(sWorld.interfaction_chat && lang > 0)
					lang = 0;

				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				Group* pGroup = _player->GetGroup();
				if(pGroup == NULL) break;

				if(GetPlayer()->m_modlanguage >= 0)
					data = sChatHandler.FillMessageData(type, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
				else if(lang == 0 && sWorld.interfaction_chat)
					data = sChatHandler.FillMessageData(type, (CanUseCommand('0') && lang != -1) ? LANG_UNIVERSAL : lang, msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
				else
					data = sChatHandler.FillMessageData(type, (CanUseCommand('c') && lang != -1) ? LANG_UNIVERSAL : lang, msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
				if(type == CHAT_MSG_PARTY && pGroup->GetGroupType() == GROUP_TYPE_RAID)
				{
					// only send to that subgroup
					SubGroup* sgr = _player->GetGroup() ?
					                _player->GetGroup()->GetSubGroup(_player->GetSubGroup()) : 0;

					if(sgr)
					{
						_player->GetGroup()->Lock();
						for(GroupMembersSet::iterator itr = sgr->GetGroupMembersBegin(); itr != sgr->GetGroupMembersEnd(); ++itr)
						{
							if((*itr)->m_loggedInPlayer)
								(*itr)->m_loggedInPlayer->GetSession()->SendChatPacket(data, 1, lang, this);
						}
						_player->GetGroup()->Unlock();
					}
				}
				else
				{
					SubGroup* sgr;
					for(uint32 i = 0; i < _player->GetGroup()->GetSubGroupCount(); ++i)
					{
						sgr = _player->GetGroup()->GetSubGroup(i);
						_player->GetGroup()->Lock();
						for(GroupMembersSet::iterator itr = sgr->GetGroupMembersBegin(); itr != sgr->GetGroupMembersEnd(); ++itr)
						{
							if((*itr)->m_loggedInPlayer)
								(*itr)->m_loggedInPlayer->GetSession()->SendChatPacket(data, 1, lang, this);
						}
						_player->GetGroup()->Unlock();

					}
				}
				//sLog.outString("[party] %s: %s", _player->GetName(), msg.c_str());
				delete data;
			}
			break;
		case CHAT_MSG_GUILD:
			{
				if(sChatHandler.ParseCommands(msg.c_str(), this) > 0)
				{
					break;
				}

				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				if(_player->m_playerInfo->guild)
					_player->m_playerInfo->guild->GuildChat(msg.c_str(), this, lang);

			}
			break;
		case CHAT_MSG_OFFICER:
			{
				if(sChatHandler.ParseCommands(msg.c_str(), this) > 0)
					break;

				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				if(_player->m_playerInfo->guild)
					_player->m_playerInfo->guild->OfficerChat(msg.c_str(), this, lang);

			}
			break;
		case CHAT_MSG_YELL:
			{
				if(sWorld.interfaction_chat && lang > 0)
					lang = 0;

				if(sChatHandler.ParseCommands(msg.c_str(), this) > 0)
					break;

				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}
				if(lang > 0 && LanguageSkills[lang] && _player->_HasSkillLine(LanguageSkills[lang]) == false)
					return;

				if(lang == 0 && sWorld.interfaction_chat)
					data = sChatHandler.FillMessageData(CHAT_MSG_YELL, (CanUseCommand('0') && lang != -1) ? LANG_UNIVERSAL : lang,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);

				else if(lang == 0 && !CanUseCommand('c'))
				{
					if(data != NULL)
						delete data;
					return;
				}

				else if(GetPlayer()->m_modlanguage >= 0)
					data = sChatHandler.FillMessageData(CHAT_MSG_YELL, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
				else
					data = sChatHandler.FillMessageData(CHAT_MSG_YELL, (CanUseCommand('c') && lang != -1) ? LANG_UNIVERSAL : lang,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);

				_player->GetMapMgr()->SendChatMessageToCellPlayers(_player, data, 2, 1, lang, this);
				delete data;
			}
			break;
		case CHAT_MSG_WHISPER:
			{
				if(lang != -1)
					lang = LANG_UNIVERSAL; //All whispers are universal
				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				PlayerCache* playercache = objmgr.GetPlayerCache(to.c_str(), false);
				if(playercache == NULL)
				{
					data = new WorldPacket(SMSG_CHAT_PLAYER_NOT_FOUND, to.length() + 1);
					*data << to;
					SendPacket(data);
					delete data;
					break;
				}

				if(_player->GetTeamInitial() != playercache->GetUInt32Value(CACHE_PLAYER_INITIALTEAM) && !sWorld.interfaction_chat && !playercache->HasFlag(CACHE_PLAYER_FLAGS, PLAYER_FLAG_GM) && !_player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM))
				{
					WorldPacket response(SMSG_CHAT_PLAYER_NOT_FOUND, to.length() + 1);
					response << to;
					SendPacket(&response);
					playercache->DecRef();
					break;
				}

				// Check that the player isn't a gm with his status on
				// TODO: Game Master's on retail are able to have block whispers after they close the ticket with the current packet.
				// When a Game Master is visible to your player it says "This player is unavailable for whisper" I need to figure out how this done.
				if(!HasPermissions() && playercache->HasFlag(CACHE_PLAYER_FLAGS, PLAYER_FLAG_GM) && playercache->CountValue64(CACHE_GM_TARGETS, _player->GetGUID()) == 0)
				{
					// Build automated reply
					string Reply = "SYSTEM: This Game Master does not currently have an open ticket from you and did not receive your whisper. Please submit a new GM Ticket request if you need to speak to a GM. This is an automatic message.";
					data = sChatHandler.FillMessageData(CHAT_MSG_WHISPER_INFORM, LANG_UNIVERSAL, Reply.c_str(), playercache->GetGUID(), 4);
					SendPacket(data);
					delete data;
					playercache->DecRef();
					break;
				}

				if(playercache->CountValue64(CACHE_SOCIAL_IGNORELIST, _player->GetLowGUID()) > 0)
				{
					data = sChatHandler.FillMessageData(CHAT_MSG_IGNORED, LANG_UNIVERSAL,  msg.c_str(), playercache->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
					SendPacket(data);
					delete data;
					playercache->DecRef();
					break;
				}
				else
				{
					data = sChatHandler.FillMessageData(CHAT_MSG_WHISPER, lang,  msg.c_str(), _player->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
					playercache->SendPacket(data);
				}


				//Sent the to Users id as the channel, this should be fine as it's not used for whisper
				if(lang != -1) //DO NOT SEND if its an addon message!
				{
					data = sChatHandler.FillMessageData(CHAT_MSG_WHISPER_INFORM, LANG_UNIVERSAL, msg.c_str(), playercache->GetGUID(), playercache->HasFlag(CACHE_PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
					SendPacket(data);
					delete data;
				}

				if(playercache->HasFlag(CACHE_PLAYER_FLAGS, PLAYER_FLAG_AFK))
				{
					// Has AFK flag, autorespond.
					std::string reason;
					playercache->GetStringValue(CACHE_AFK_DND_REASON, reason);

					data = sChatHandler.FillMessageData(CHAT_MSG_AFK, LANG_UNIVERSAL, reason.c_str(), playercache->GetGUID(), _player->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
					SendPacket(data);
					delete data;
				}
				else if(playercache->HasFlag(CACHE_PLAYER_FLAGS, PLAYER_FLAG_DND))
				{
					// Has DND flag, autorespond.
					std::string reason;
					playercache->GetStringValue(CACHE_AFK_DND_REASON, reason);
					data = sChatHandler.FillMessageData(CHAT_MSG_DND, LANG_UNIVERSAL, reason.c_str(), playercache->GetGUID(), playercache->HasFlag(CACHE_PLAYER_FLAGS, PLAYER_FLAG_GM) ? 4 : 0);
					SendPacket(data);
					delete data;
				}

				playercache->DecRef();

			}
			break;
		case CHAT_MSG_CHANNEL:
			{
				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				if(sChatHandler.ParseCommands(msg.c_str(), this) > 0)
					break;

				chn = channelmgr.GetChannel(channel.c_str(), GetPlayer());
				if(chn)
				{
					//g_chatFilter->ParseEscapeCodes((char*)pMsg, (chn->m_flags & CHANNEL_PACKET_ALLOWLINKS)>0 );
					chn->Say(GetPlayer(), msg.c_str(), NULL, false);
				}
			}
			break;
		case CHAT_MSG_AFK:
			{
				std::string reason = "";
				recv_data >> reason;

				GetPlayer()->SetAFKReason(reason);

				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				/* WorldPacket *data, WorldSession* session, uint32 type, uint32 language, const char *channelName, const char *message*/
				if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK))
				{
					GetPlayer()->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK);
					if(sWorld.GetKickAFKPlayerTime())
						sEventMgr.RemoveEvents(GetPlayer(), EVENT_PLAYER_SOFT_DISCONNECT);
				}
				else
				{
					GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK);

					if(GetPlayer()->m_bg)
						GetPlayer()->m_bg->RemovePlayer(GetPlayer(), false);

					if(sWorld.GetKickAFKPlayerTime())
						sEventMgr.AddEvent(GetPlayer(), &Player::SoftDisconnect, EVENT_PLAYER_SOFT_DISCONNECT, sWorld.GetKickAFKPlayerTime(), 1, 0);
				}
			}
			break;
		case CHAT_MSG_DND:
			{
				std::string reason;
				recv_data >> reason;
				GetPlayer()->SetAFKReason(reason);

				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}

				if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_DND))
					GetPlayer()->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAG_DND);
				else
				{
					GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAG_DND);
				}
			}
			break;

		case CHAT_MSG_BATTLEGROUND:
		case CHAT_MSG_BATTLEGROUND_LEADER:
			{
				if(sChatHandler.ParseCommands(msg.c_str(), this) > 0)
					break;

				if(g_chatFilter->Parse(msg) == true)
				{
					SystemMessage("Your chat message was blocked by a server-side filter.");
					return;
				}
				if(_player->m_bg != NULL)
				{
					data = sChatHandler.FillMessageData(type, lang, msg.c_str(), _player->GetGUID());
					_player->m_bg->DistributePacketToTeam(data, _player->GetTeam());
					delete data;
				}
			}
			break;
	}
}
示例#16
0
void WorldSession::LogoutPlayer(bool Save)
{
    Player* pPlayer = GetPlayer();

    if (_loggingOut)
        return;

    _loggingOut = true;

    if (_player != NULL)
    {
        _player->SetFaction(_player->GetInitialFactionId());

        objmgr.RemovePlayer(_player);
        _player->ok_to_remove = true;

        sHookInterface.OnLogout(pPlayer);
        if (_player->DuelingWith)
            _player->DuelingWith->EndDuel(DUEL_WINNER_RETREAT);

        if (_player->m_currentLoot && _player->IsInWorld())
        {
            Object* obj = _player->GetMapMgr()->_GetObject(_player->m_currentLoot);
            if (obj != NULL)
            {
                switch (obj->getObjectTypeId())
                {
                    case TYPEID_UNIT:
                        static_cast <Creature*>(obj)->loot.looters.erase(_player->getGuidLow());
                        break;
                    case TYPEID_GAMEOBJECT:
                        GameObject* go = static_cast<GameObject*>(obj);

                        if (!go->IsLootable())
                            break;

                        GameObject_Lootable* pLGO = static_cast<GameObject_Lootable*>(go);
                        pLGO->loot.looters.erase(_player->getGuidLow());

                        break;
                }
            }
        }

#ifndef GM_TICKET_MY_MASTER_COMPATIBLE
        GM_Ticket* ticket = objmgr.GetGMTicketByPlayer(_player->getGuid());
        if (ticket != NULL)
        {
            // Send status change to gm_sync_channel
            Channel* chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), _player);
            if (chn)
            {
                std::stringstream ss;
                ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_ONLINESTATE;
                ss << ":" << ticket->guid;
                ss << ":0";
                chn->Say(_player, ss.str().c_str(), NULL, true);
            }
        }
#endif

        // part channels
        _player->CleanupChannels();

        auto transport = _player->GetTransport();
        if (transport != nullptr)
        {
            transport->RemovePassenger(_player);
        }

        // cancel current spell
        for (uint8_t i = 0; i < CURRENT_SPELL_MAX; ++i)
        {
            if (_player->getCurrentSpell(CurrentSpellType(i)) != nullptr)
                _player->interruptSpellWithSpellType(CurrentSpellType(i));
        }

        _player->Social_TellFriendsOffline();

        // Decrement the global player count
        sWorld.decrementPlayerCount(_player->GetTeam());

        if (_player->m_bgIsQueued)
            BattlegroundManager.RemovePlayerFromQueues(_player);

        // Repop or Resurrect and remove from battlegrounds
        if (_player->m_bg)
        {
            if (pPlayer->getDeathState() == JUST_DIED)
                pPlayer->RemoteRevive();
            if (pPlayer->getDeathState() != ALIVE)
                pPlayer->ResurrectPlayer();
            _player->m_bg->RemovePlayer(_player, true);
        }
        else if (_player->IsDead() && _player->getDeathState() == JUST_DIED)
            _player->RepopRequestedPlayer();

        // Issue a message telling all guild members that this player signed
        // off
#if VERSION_STRING != Cata
        if (_player->IsInGuild())
        {
            Guild* pGuild = _player->m_playerInfo->guild;
            if (pGuild != NULL)
                pGuild->LogGuildEvent(GE_SIGNED_OFF, 1, _player->GetName());
        }
#endif

        _player->GetItemInterface()->EmptyBuyBack();
        _player->GetItemInterface()->removeLootableItems();

        // Save HP/Mana
        _player->load_health = _player->getHealth();
        _player->load_mana = _player->GetPower(POWER_TYPE_MANA);


        _player->summonhandler.RemoveAllSummons();

        _player->DismissActivePets();

        // _player->SaveAuras();

        if (Save)
            _player->SaveToDB(false);

        // Dismounting with RemoveAllAuras may in certain cases add a player
        // aura,
        // which can result in a nice crash during shutdown. Therefore let's
        // dismount on logout.
        // Ofc if the player was mounted on login they will be still mounted
        // ;)
        _player->Dismount();

        _player->RemoveAllAuras();
        if (_player->IsInWorld())
            _player->RemoveFromWorld();

        _player->m_playerInfo->m_loggedInPlayer = NULL;

        if (_player->m_playerInfo->m_Group != NULL)
            _player->m_playerInfo->m_Group->Update();

        // Remove the "player locked" flag, to allow movement on next login
        GetPlayer()->removeUnitFlags(UNIT_FLAG_LOCK_PLAYER);

        // Save Honor Points
        // _player->SaveHonorFields();

        // Update any dirty account_data fields.
        bool dirty = false;

        if (worldConfig.server.useAccountData)
        {
            std::stringstream ss;
            ss << "UPDATE account_data SET ";
            for (uint32 ui = 0; ui < 8; ui++)
            {
                if (sAccountData[ui].bIsDirty)
                {
                    if (dirty)
                        ss << ",";
                    ss << "uiconfig" << ui << "=\"";

                    if (sAccountData[ui].data)
                    {
                        CharacterDatabase.EscapeLongString(sAccountData[ui].data, sAccountData[ui].sz, ss);
                        // ss.write(sAccountData[ui].data,sAccountData[ui].sz);
                    }
                    ss << "\"";
                    dirty = true;
                    sAccountData[ui].bIsDirty = false;
                }
            }
            if (dirty)
            {
                ss << " WHERE acct=" << _accountId << ";";
                CharacterDatabase.ExecuteNA(ss.str().c_str());
            }
        }

        delete _player;
        _player = NULL;

        OutPacket(SMSG_LOGOUT_COMPLETE, 0, NULL);
        LOG_DEBUG("SESSION: Sent SMSG_LOGOUT_COMPLETE Message");
    }
    _loggingOut = false;

    SetLogoutTimer(0);
}
示例#17
0
void WorldSession::FullLogin(Player * plr)
{
	Log.Debug("WorldSession", "Fully loading player %u", plr->GetLowGUID());
	SetPlayer(plr); 
	m_MoverWoWGuid.Init(plr->GetGUID());

	MapMgr *mgr = sInstanceMgr.GetInstance(static_cast< Object* >( plr ));  
	if (mgr && mgr->m_battleground)
	{
		/* Don't allow player to login into a bg that has ended or is full */
		if (mgr->m_battleground->HasEnded() == true ||
			mgr->m_battleground->HasFreeSlots(plr->GetTeamInitial(), mgr->m_battleground->GetType() == false)) {
				mgr = NULL;
		}
	}

	/* Trying to log to an instance that doesn't exists anymore? */
	if (!mgr)
	{
		if(!IS_INSTANCE(plr->m_bgEntryPointMap))
		{
			plr->m_position.x = plr->m_bgEntryPointX;
			plr->m_position.y = plr->m_bgEntryPointY;
			plr->m_position.z = plr->m_bgEntryPointZ;
			plr->m_position.o = plr->m_bgEntryPointO;
			plr->m_mapId = plr->m_bgEntryPointMap;
		}
		else
		{
			plr->m_position.x = plr->GetBindPositionX();
			plr->m_position.y = plr->GetBindPositionY();
			plr->m_position.z = plr->GetBindPositionZ();
			plr->m_position.o = 0;
			plr->m_mapId = plr->GetBindMapId();
		}
	}

	// copy to movement array
	movement_packet[0] = m_MoverWoWGuid.GetNewGuidMask();
	memcpy(&movement_packet[1], m_MoverWoWGuid.GetNewGuid(), m_MoverWoWGuid.GetNewGuidLen());

	/* world preload */
	packetSMSG_LOGIN_VERIFY_WORLD vwpck;
	vwpck.MapId = plr->GetMapId();
	vwpck.O = plr->GetOrientation();
	vwpck.X = plr->GetPositionX();
	vwpck.Y = plr->GetPositionY();
	vwpck.Z = plr->GetPositionZ();
	OutPacket( SMSG_LOGIN_VERIFY_WORLD, sizeof(packetSMSG_LOGIN_VERIFY_WORLD), &vwpck );

	// send voicechat state - active/inactive
	/*
	{SERVER} Packet: (0x03C7) UNKNOWN PacketSize = 2
	|------------------------------------------------|----------------|
	|00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |0123456789ABCDEF|
	|------------------------------------------------|----------------|
	|02 01							               |..              |
	-------------------------------------------------------------------
	*/


#ifndef USING_BIG_ENDIAN
	StackWorldPacket<20> datab(SMSG_VOICE_SYSTEM_STATUS);
#else
	WorldPacket datab(SMSG_VOICE_SYSTEM_STATUS, 20);
#endif

#ifdef VOICE_CHAT
	datab.Initialize(SMSG_VOICE_SYSTEM_STATUS);
	datab << uint8(2) << uint8(sVoiceChatHandler.CanUseVoiceChat() ? 1 : 0);
	SendPacket(&datab);
#else
	datab.Initialize(SMSG_VOICE_SYSTEM_STATUS);
	datab << uint8(2) << uint8(0);
#endif

	plr->UpdateAttackSpeed();
	/*if(plr->getLevel()>PLAYER_LEVEL_CAP_70)
		plr->SetUInt32Value(UNIT_FIELD_LEVEL,PLAYER_LEVEL_CAP_70);*/

	// enable trigger cheat by default
	// plr->TriggerpassCheat = HasGMPermissions();

	// Make sure our name exists (for premade system)
	PlayerInfo * info = objmgr.GetPlayerInfo(plr->GetLowGUID());
	if(info == 0)
	{
		info = new PlayerInfo;
		info->cl = plr->getClass();
		info->gender = plr->getGender();
		info->guid = plr->GetLowGUID();
		info->name = strdup(plr->GetName());
		info->lastLevel = plr->getLevel();
		info->lastOnline = UNIXTIME;
		info->lastZone = plr->GetZoneId();
		info->race = plr->getRace();
		info->team = plr->GetTeam();
		info->guild=NULL;
		info->guildRank=NULL;
		info->guildMember=NULL;
		info->m_Group=0;
		info->subGroup=0;
		objmgr.AddPlayerInfo(info);
	}
	plr->m_playerInfo = info;
	if(plr->m_playerInfo->guild)
	{
		plr->m_uint32Values[PLAYER_GUILDID] = plr->m_playerInfo->guild->GetGuildId();
		plr->m_uint32Values[PLAYER_GUILDRANK] = plr->m_playerInfo->guildRank->iId;
	}

	info->m_loggedInPlayer = plr;

	// account data == UI config
#ifndef USING_BIG_ENDIAN
	StackWorldPacket<128> data(SMSG_ACCOUNT_DATA_MD5);
#else
	WorldPacket data(SMSG_ACCOUNT_DATA_MD5, 128);
#endif

	MD5Hash md5hash;

	for (int i = 0; i < 8; i++)
	{
		AccountDataEntry* acct_data = GetAccountData(i);

		if (!acct_data->data)
		{
			data << uint64(0) << uint64(0);				// Nothing.
			continue;
		}
		md5hash.Initialize();
		md5hash.UpdateData((const uint8*)acct_data->data, acct_data->sz);
		md5hash.Finalize();

#ifndef USING_BIG_ENDIAN
		data.Write(md5hash.GetDigest(), MD5_DIGEST_LENGTH);
#else
		data.append(md5hash.GetDigest(), MD5_DIGEST_LENGTH);
#endif
	}
	SendPacket(&data);

	// Set TIME OF LOGIN
	CharacterDatabase.Execute("UPDATE characters SET online = 1 WHERE guid = %u" , plr->GetLowGUID());

	bool enter_world = true;
#ifndef CLUSTERING
	// Find our transporter and add us if we're on one.
	if(plr->m_TransporterGUID != 0)
	{
		Transporter * pTrans = objmgr.GetTransporter(GUID_LOPART(plr->m_TransporterGUID));
		if(pTrans)
		{
			if(plr->isDead())
			{
				plr->ResurrectPlayer();
				plr->SetUInt32Value(UNIT_FIELD_HEALTH, plr->GetUInt32Value(UNIT_FIELD_MAXHEALTH));
				plr->SetUInt32Value(UNIT_FIELD_POWER1, plr->GetUInt32Value(UNIT_FIELD_MAXPOWER1));
			}

			float c_tposx = pTrans->GetPositionX() + plr->m_TransporterX;
			float c_tposy = pTrans->GetPositionY() + plr->m_TransporterY;
			float c_tposz = pTrans->GetPositionZ() + plr->m_TransporterZ;
			if(plr->GetMapId() != pTrans->GetMapId())	   // loaded wrong map
			{
				plr->SetMapId(pTrans->GetMapId());
#ifndef USING_BIG_ENDIAN
				StackWorldPacket<20> dataw(SMSG_NEW_WORLD);
#else
				WorldPacket dataw(SMSG_NEW_WORLD, 20);
#endif
				dataw << pTrans->GetMapId() << c_tposx << c_tposy << c_tposz << plr->GetOrientation();
				SendPacket(&dataw);

				// shit is sent in worldport ack.
				enter_world = false;
			}

			plr->SetPosition(c_tposx, c_tposy, c_tposz, plr->GetOrientation(), false);
			plr->m_CurrentTransporter = pTrans;
			pTrans->AddPlayer(plr);
		}
	}
#endif
	if(HasGMPermissions())
	{	//Toggle for admin chat color. --Hemi
		if(_accountId == 1) //Hemi's chat color. Greenish..
			GetPlayer()->chatColor = "|cff96E798 ";
		else if(_accountId == 3) //Paws' chat color. Magneta.
			GetPlayer()->chatColor ="|cFFF52887 ";
		else if(CanUseCommand('z'))	//Admin chat colors
			GetPlayer()->chatColor = MSG_COLOR_LIGHTBLUE;	
		else if(CanUseCommand('a') && !CanUseCommand('z'))	//Co-Admin chat color
			GetPlayer()->chatColor = MSG_COLOR_LIGHTRED;		
	}

	Log.Debug("Login", "Player %s logged in.", plr->GetName());
	sLog.outString("[%s] has logged in.", plr->GetName());
	if(plr->GetTeam() == 1)
		sWorld.HordePlayers++;
	else
		sWorld.AlliancePlayers++;

	if(plr->m_FirstLogin && !HasGMPermissions())
	{
		uint32 racecinematic = plr->myRace->cinematic_id;
#ifdef USING_BIG_ENDIAN
		swap32(&racecinematic);
#endif
		OutPacket(SMSG_TRIGGER_CINEMATIC, 4, &racecinematic);

#ifdef _TEST_EXTENDED_FEATURES_
	const int classtext[] ={0,5,6,8,9,11,0,4,3,7,0,10};
	sWorld.SendLocalizedWorldText(true,"{65}",classtext[ (uint32)plr->getClass() ] , plr->GetName() , (plr->GetTeam() ? "{63}":"{64}") );
#endif

	}

	sLog.outDetail( "WORLD: Created new player for existing players (%s)", plr->GetName() );

	// Login time, will be used for played time calc
	plr->m_playedtime[2] = (uint32)UNIXTIME;

	//Issue a message telling all guild members that this player has signed on
	if(plr->IsInGuild())
	{
		Guild *pGuild = plr->m_playerInfo->guild;
		if(pGuild)
		{
			WorldPacket data(50);
			data.Initialize(SMSG_GUILD_EVENT);
			data << uint8(GUILD_EVENT_MOTD);
			data << uint8(0x01);
			if(pGuild->GetMOTD())
				data << pGuild->GetMOTD();
			else
				data << uint8(0);
			SendPacket(&data);

			pGuild->LogGuildEvent(GUILD_EVENT_HASCOMEONLINE, 1, plr->GetName());
		}
	}

	// Send online status to people having this char in friendlist
	_player->Social_TellFriendsOnline();
	// send friend list (for ignores)
	_player->Social_SendFriendList(7);

#ifndef GM_TICKET_MY_MASTER_COMPATIBLE
	GM_Ticket * ticket = objmgr.GetGMTicketByPlayer(_player->GetGUID());
	if(ticket != NULL)
	{
		//Send status change to gm_sync_channel
		Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), _player);
		if(chn)
		{
			std::stringstream ss;
			ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_ONLINESTATE;
			ss << ":" << ticket->guid;
			ss << ":1";
			chn->Say(_player, ss.str().c_str(), NULL, true);
		}
	}
#endif

	// Send MOTD
	_player->BroadcastMessage(sWorld.GetMotd());

	// Send revision (if enabled)
#ifdef WIN32
	_player->BroadcastMessage("Powered by: %sArcEmu %s r%u/%s-Win-%s %s(Please report ALL bugs to www.ArcEmu.org/forums/)", MSG_COLOR_WHITE, BUILD_TAG,
		BUILD_REVISION, CONFIG, ARCH, MSG_COLOR_LIGHTBLUE);		
#else
	_player->BroadcastMessage("Powered by: %sArcEmu %s r%u/%s-%s %s(Please report ALL bugs to www.ArcEmu.org/forums/)", MSG_COLOR_WHITE, BUILD_TAG,
		BUILD_REVISION, PLATFORM_TEXT, ARCH, MSG_COLOR_LIGHTBLUE);
#endif

	if(sWorld.SendStatsOnJoin || HasGMPermissions() )
	{
		_player->BroadcastMessage("Online Players: %s%u |rPeak: %s%u|r Accepted Connections: %s%u",
			MSG_COLOR_WHITE, sWorld.GetSessionCount(), MSG_COLOR_WHITE, sWorld.PeakSessionCount, MSG_COLOR_WHITE, sWorld.mAcceptedConnections);
	}

	//Set current RestState
	if( plr->m_isResting) 		// We are resting at an inn , turn on Zzz
		plr->ApplyPlayerRestState(true);

	//Calculate rest bonus if there is time between lastlogoff and now
	if( plr->m_timeLogoff > 0 && plr->GetUInt32Value(UNIT_FIELD_LEVEL) < plr->GetUInt32Value(PLAYER_FIELD_MAX_LEVEL))	// if timelogoff = 0 then it's the first login
	{
		uint32 currenttime = (uint32)UNIXTIME;
		uint32 timediff = currenttime - plr->m_timeLogoff;

		//Calculate rest bonus
		if( timediff > 0 ) 
			plr->AddCalculatedRestXP(timediff);
	}

#ifdef CLUSTERING
	plr->SetInstanceID(forced_instance_id);
	plr->SetMapId(forced_map_id);
#else
	sHookInterface.OnEnterWorld2(_player);
#endif

	if(info->m_Group)
		info->m_Group->Update();

	if(enter_world && !_player->GetMapMgr())
	{
		plr->AddToWorld();
	}

	objmgr.AddPlayer(_player);

	if(info->m_Group == NULL)
		plr->SendDungeonDifficulty();
}
示例#18
0
bool ChatHandler::HandleGMTicketAssignToCommand(const char* args, WorldSession *m_session)
{
	uint64 ticketGuid;
	char guidString[100], name[100];
	int argc = sscanf(args,"%s %s", guidString, name);
	if(argc < 1 || argc > 2)
		return false;

	ticketGuid = atoi(guidString);
	if(!ticketGuid)
	{
		RedSystemMessage(m_session, "You must specify a ticket id.");
		return true;
	}

	Player *cplr = m_session->GetPlayer();
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid);
	if(ticket == NULL || ticket->deleted)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not found.", cplr, true);
		return true;
	}

	Player *plr = (argc == 1 ? cplr : objmgr.GetPlayer(name, false));
	if(plr == NULL)
	{
		chn->Say(cplr, "GmTicket:0:Player not found.", cplr, true);
		return true;
	}

	if(!plr->IsInWorld())
	{
		chn->Say(cplr, "GmTicket:0:Player isn't online.", cplr, true);
		return true;
	}

	if(plr->GetSession()->GetPermissionCount() == 0)
	{
		chn->Say(cplr, "GmTicket:0:Player is not a GM.", cplr, true);
		return true;
	}

	if(ticket->assignedToPlayer == plr->GetGUID())
	{
		chn->Say(cplr, "GmTicket:0:Ticket already assigned to this GM.", cplr, true);
		return true;
	}

	if(ticket->assignedToPlayer != 0 && ticket->assignedToPlayer != cplr->GetGUID())
	{
		Player *aplr = objmgr.GetPlayer((uint32)ticket->assignedToPlayer);
		if(aplr != NULL && aplr->IsInWorld() && !cplr->GetSession()->CanUseCommand('z'))
		{
			chn->Say(cplr, "GmTicket:0:Ticket already assigned to another GM.", cplr, true);
			return true;
		}
	}

	ticket->assignedToPlayer = plr->GetGUID();
	objmgr.UpdateGMTicket(ticket);

	std::stringstream ss;
	ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_ASSIGNED;
	ss << ":" << ticket->guid;
	ss << ":" << plr->GetName();
	chn->Say(cplr, ss.str().c_str(), NULL, true);

	return true;
}
示例#19
0
bool ChatHandler::HandleGMTicketAssignToCommand(const char* args, WorldSession* m_session)
{
	uint64 ticketGuid;
	char guidString[100], name[100];
	int argc = sscanf(args, "%s %s", guidString, name);
	if(argc < 1 || argc > 2)
		return false;

	ticketGuid = atoi(guidString);
	if(!ticketGuid)
	{
		RedSystemMessage(m_session, "You must specify a ticket id.");
		return true;
	}

	Player* cplr = m_session->GetPlayer();
	Channel* chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), cplr);
	if(!chn)
		return false;

	GM_Ticket* ticket = objmgr.GetGMTicket(ticketGuid);

	if(ticket == NULL || ticket->deleted)
	{
		chn->Say(cplr, "GmTicket:0:Ticket not found.", cplr, true);
		return true;
	}

	Player* mplr = objmgr.GetPlayer((uint32)ticket->playerGuid);
	Player* plr = (argc == 1 ? cplr : objmgr.GetPlayer(name, false));
	if(plr == NULL)
	{
		chn->Say(cplr, "GmTicket:0:Player not found.", cplr, true);
		return true;
	}

	if(!plr->IsInWorld())
	{
		chn->Say(cplr, "GmTicket:0:Player isn't online.", cplr, true);
		return true;
	}

	if(plr->GetSession()->GetPermissionCount() == 0)
	{
		chn->Say(cplr, "GmTicket:0:Player is not a GM.", cplr, true);
		return true;
	}

	if(ticket->assignedToPlayer == plr->GetGUID())
	{
		chn->Say(cplr, "GmTicket:0:Ticket already assigned to this GM.", cplr, true);
		return true;
	}

	if(ticket->assignedToPlayer != 0 && ticket->assignedToPlayer != cplr->GetGUID())
	{
		Player* aplr = objmgr.GetPlayer((uint32)ticket->assignedToPlayer);
		if(aplr != NULL && aplr->IsInWorld() && !cplr->GetSession()->CanUseCommand('z'))
		{
			chn->Say(cplr, "GmTicket:0:Ticket already assigned to another GM.", cplr, true);
			return true;
		}
	}

	ticket->assignedToPlayer = plr->GetGUID();
	objmgr.UpdateGMTicket(ticket);

	std::stringstream ss;
	ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_ASSIGNED;
	ss << ":" << ticket->guid;
	ss << ":" << plr->GetName();
	chn->Say(cplr, ss.str().c_str(), NULL, true);
	//Send Response Packet to update Ticket
	//WorldPacket data(SMSG_GMTICKET_GETTICKET, 400);
	//data << uint32(6); // Packet Status
	//data << uint8(0x7);//static Category
	//data << ticket->message.c_str();//ticketDescription
	//data << float(0.0);//ticketAge - days //update time =  last time ticket was modified?
	//data << float(0.0);//oldestTicketTime - days
	//data << float(0.0);//updateTime - days | How recent is the data for oldest ticket time, measured in days.  If this number 1 hour, we have bad data.
	//data << unit64(2);//assignedToGM |0 - ticket is not currently assigned to a gm | 1 - ticket is assigned to a normal gm |	2 - ticket is in the escalation queue
	//data << uint64(1);//openedByGM | 0 - ticket has never been opened by a gm | 1 - ticket has been opened by a gm
	//mplr->GetSession()->SendPacket( &data );
	SystemMessageToPlr(mplr, "SYSTEM: Your ticket has been escalated. A Senior Game Master will be with you shortly!");
	return true;
}
示例#20
0
void WorldSession::FullLogin(Player* plr)
{
    Log.Debug("WorldSession", "Fully loading player %u", plr->GetLowGUID());

    SetPlayer(plr);
    m_MoverWoWGuid.Init(plr->GetGUID());

    MapMgr* mgr = sInstanceMgr.GetInstance(plr);
    if (mgr && mgr->m_battleground)
    {
        // Don't allow player to login into a bg that has ended or is full
        if (mgr->m_battleground->HasEnded() || mgr->m_battleground->HasFreeSlots(plr->GetTeamInitial(), mgr->m_battleground->GetType() == false))
            mgr = NULL;
    }

    // Trying to log to an instance that doesn't exists anymore?
    if (!mgr)
    {
        if (!IS_INSTANCE(plr->m_bgEntryPointMap))
        {
            plr->m_position.x = plr->m_bgEntryPointX;
            plr->m_position.y = plr->m_bgEntryPointY;
            plr->m_position.z = plr->m_bgEntryPointZ;
            plr->m_position.o = plr->m_bgEntryPointO;
            plr->m_mapId = plr->m_bgEntryPointMap;
        }
        else
        {
            plr->m_position.x = plr->GetBindPositionX();
            plr->m_position.y = plr->GetBindPositionY();
            plr->m_position.z = plr->GetBindPositionZ();
            plr->m_position.o = 0;
            plr->m_mapId = plr->GetBindMapId();
        }
    }

    // copy to movement array
    movement_packet[0] = m_MoverWoWGuid.GetNewGuidMask();
    memcpy(&movement_packet[1], m_MoverWoWGuid.GetNewGuid(), m_MoverWoWGuid.GetNewGuidLen());

    // world preload
    uint32 VMapId;
    float VO;
    float VX;
    float VY;
    float VZ;

    // GMs should start on GM Island and be bound there
    if (HasGMPermissions() && plr->m_FirstLogin && sWorld.gamemaster_startonGMIsland)
    {
        VMapId = 1;
        VO = 0;
        VX = 16222.6f;
        VY = 16265.9f;
        VZ = 14.2085f;

        plr->m_position.x = VX;
        plr->m_position.y = VY;
        plr->m_position.z = VZ;
        plr->m_position.o = VO;
        plr->m_mapId = VMapId;

        plr->SetBindPoint(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), plr->GetMapId(), plr->GetZoneId());
    }
    else
    {
        VMapId = plr->GetMapId();
        VO = plr->GetOrientation();
        VX = plr->GetPositionX();
        VY = plr->GetPositionY();
        VZ = plr->GetPositionZ();
    }

    plr->SendLoginVerifyWorld(VMapId, VX, VY, VZ, VO);

    ///////////////////////////////////////////////////////////////////////////////////////////////////////
    // send voicechat state - active/inactive
    //
    // {SERVER} Packet: (0x03C7) UNKNOWN PacketSize = 2
    // |------------------------------------------------|----------------|
    // |00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |0123456789ABCDEF|
    // |------------------------------------------------|----------------|
    // |02 01                                            |..              |
    // -------------------------------------------------------------------
    //
    //
    // Old packetdump is OLD. This is probably from 2.2.0 (that was the patch when it was added to wow)!
    //
    //////////////////////////////////////////////////////////////////////////////////////////////////////

    StackWorldPacket<20> datab(SMSG_FEATURE_SYSTEM_STATUS);

    datab.Initialize(SMSG_FEATURE_SYSTEM_STATUS);

    datab << uint8(2);
    datab << uint8(0);

    SendPacket(&datab);

    WorldPacket dataldm(SMSG_LEARNED_DANCE_MOVES, 4 + 4);

    dataldm << uint32(0);
    dataldm << uint32(0);

    SendPacket(&dataldm);

    plr->UpdateAttackSpeed();

    // Make sure our name exists (for premade system)
    PlayerInfo* info = objmgr.GetPlayerInfo(plr->GetLowGUID());
    if (!info)
    {
        info = new PlayerInfo;
        info->class_ = plr->getClass();
        info->gender = plr->getGender();
        info->guid = plr->GetLowGUID();
        info->name = strdup(plr->GetName());
        info->lastLevel = plr->getLevel();
        info->lastOnline = UNIXTIME;
        info->lastZone = plr->GetZoneId();
        info->race = plr->getRace();
        info->team = plr->GetTeam();
        info->guild = NULL;
        info->guildRank = NULL;
        info->guildMember = NULL;
        info->m_Group = NULL;
        info->subGroup = 0;
        objmgr.AddPlayerInfo(info);
    }
    plr->m_playerInfo = info;
    if (plr->m_playerInfo->guild)
    {
        plr->SetGuildId(plr->m_playerInfo->guild->GetGuildId());
        plr->SetGuildRank(plr->m_playerInfo->guildRank->iId);
    }

    info->m_loggedInPlayer = plr;

    // account data == UI config
    SendAccountDataTimes(PER_CHARACTER_CACHE_MASK);

    // Set TIME OF LOGIN
    CharacterDatabase.Execute("UPDATE characters SET online = 1 WHERE guid = %u", plr->GetLowGUID());

    bool enter_world = true;

    // Find our transporter and add us if we're on one.
    if (plr->transporter_info.guid)
    {
        if (Transporter* pTrans = objmgr.GetTransporter(Arcemu::Util::GUID_LOPART(plr->transporter_info.guid)))
        {
            if (plr->IsDead())
            {
                plr->ResurrectPlayer();
                plr->SetHealth(plr->GetMaxHealth());
                plr->SetPower(POWER_TYPE_MANA, plr->GetMaxPower(POWER_TYPE_MANA));
            }

            float c_tposx = pTrans->GetPositionX() + plr->transporter_info.x;
            float c_tposy = pTrans->GetPositionY() + plr->transporter_info.y;
            float c_tposz = pTrans->GetPositionZ() + plr->transporter_info.z;

            if (plr->GetMapId() != pTrans->GetMapId())       // loaded wrong map
            {
                plr->SetMapId(pTrans->GetMapId());

                StackWorldPacket<20> dataw(SMSG_NEW_WORLD);

                dataw << pTrans->GetMapId();
                dataw << c_tposx;
                dataw << c_tposy;
                dataw << c_tposz;
                dataw << plr->GetOrientation();

                SendPacket(&dataw);

                // shit is sent in worldport ack.
                enter_world = false;
            }

            plr->SetPosition(c_tposx, c_tposy, c_tposz, plr->GetOrientation(), false);
            plr->m_CurrentTransporter = pTrans;
            pTrans->AddPlayer(plr);
        }
    }

    Log.Debug("Login", "Player %s logged in.", plr->GetName());

    sWorld.incrementPlayerCount(plr->GetTeam());

    if (plr->m_FirstLogin)
    {
        if (PlayerCreateInfo* create_info = objmgr.GetPlayerCreateInfo(info->race, info->class_))
        {
            uint32 introid = create_info->introid;
            OutPacket(SMSG_TRIGGER_CINEMATIC, 4, &introid);
        }

        if (sWorld.m_AdditionalFun)    //cebernic: tells people who 's newbie :D
        {
            const int classtext[] = { 0, 5, 6, 8, 9, 11, 0, 4, 3, 7, 0, 10 };
            sWorld.SendLocalizedWorldText(true, "{65}", classtext[(uint32)plr->getClass()], plr->GetName(), (plr->IsTeamHorde() ? "{63}" : "{64}"));
        }
    }

    LOG_DETAIL("WORLD: Created new player for existing players (%s)", plr->GetName());

    // Login time, will be used for played time calc
    plr->m_playedtime[2] = uint32(UNIXTIME);

    //Issue a message telling all guild members that this player has signed on
    if (plr->IsInGuild())
    {
        if (Guild* pGuild = plr->m_playerInfo->guild)
        {
            WorldPacket data(SMSG_GUILD_EVENT, 50);

            data << uint8(GUILD_EVENT_MOTD);
            data << uint8(1);

            if (pGuild->GetMOTD())
                data << pGuild->GetMOTD();
            else
                data << uint8(0);

            SendPacket(&data);

            pGuild->LogGuildEvent(GUILD_EVENT_HASCOMEONLINE, 1, plr->GetName());
        }
    }

    // Send online status to people having this char in friendlist
    _player->Social_TellFriendsOnline();
    // send friend list (for ignores)
    _player->Social_SendFriendList(7);

    plr->SendDungeonDifficulty();
    plr->SendRaidDifficulty();

    plr->SendEquipmentSetList();

#ifndef GM_TICKET_MY_MASTER_COMPATIBLE
    GM_Ticket* ticket = objmgr.GetGMTicketByPlayer(_player->GetGUID());
    if (ticket != NULL)
    {
        //Send status change to gm_sync_channel
        Channel* chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(), _player);
        if (chn)
        {
            std::stringstream ss;
            ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_ONLINESTATE;
            ss << ":" << ticket->guid;
            ss << ":1";
            chn->Say(_player, ss.str().c_str(), NULL, true);
        }
    }
#endif

    // server Message Of The Day
    SendMOTD();

    //Set current RestState
    if (plr->m_isResting)
        // We are resting at an inn , turn on Zzz
        plr->ApplyPlayerRestState(true);

    //Calculate rest bonus if there is time between lastlogoff and now
    if (plr->m_timeLogoff > 0 && plr->getLevel() < plr->GetMaxLevel())    // if timelogoff = 0 then it's the first login
    {
        uint32 currenttime = uint32(UNIXTIME);
        uint32 timediff = currenttime - plr->m_timeLogoff;

        //Calculate rest bonus
        if (timediff > 0)
            plr->AddCalculatedRestXP(timediff);
    }

    if (info->m_Group)
        info->m_Group->Update();

    if (enter_world && !_player->GetMapMgr())
        plr->AddToWorld();

    sHookInterface.OnFullLogin(_player);

    objmgr.AddPlayer(_player);
}
示例#21
0
void
WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
{
    WorldPacket data;

    sLog.outDebug("CHAT: packet received");

    uint32 type;
    uint32 lang;

    recv_data >> type;
    recv_data >> lang;
    switch(type)
    {
        case CHAT_MSG_SAY:
		{
			std::string msg, t;
            recv_data >> msg;

			t = msg;
            if (sChatHandler.ParseCommands (t.c_str(), this) > 0)
				break;
			// If you want universal chatting use this instead of following line
            //sChatHandler.FillMessageData( &data, this, type, LANG_UNIVERSAL, NULL, msg.c_str() );
			sChatHandler.FillMessageData( &data, this, CHAT_MSG_SAY, lang, NULL, msg.c_str() );
            GetPlayer()->SendMessageToSet( &data, true );
			sLog.outChat(lang, GetPlayer()->GetName(), "Say", msg.c_str());
        } break;
        
		case CHAT_MSG_CHANNEL:
		{
            std::string channel, msg, t;
            recv_data >> channel;
            recv_data >> msg;

			t = msg;
			if (sChatHandler.ParseCommands (t.c_str(), this) > 0)
				break;

			Channel *chn = channelmgr.GetChannel(channel.c_str(),GetPlayer());
			if(chn) chn->Say (GetPlayer(), msg.c_str());
			sLog.outChat(lang, GetPlayer()->GetName(), channel.c_str(), msg.c_str());
        } break;

		case CHAT_MSG_WHISPER: 
        {
            std::string to, msg, t;
            recv_data >> to >> msg;

			t = msg;
			if (sChatHandler.ParseCommands (t.c_str(), this) > 0)
				break;

            Player *player = objmgr.GetPlayer(to.c_str());            
			if (!player)
			{
                data.clear();
                //sChatHandler.FillSystemMessageData( &data, this, msg.c_str() );
                //SendPacket(&data);
				this->SystemMessage ("Player '%s' isn't online", to.c_str());
				sLog.outDebug ("ChatHandler.Whisper: Player '%s' isn't online", to.c_str());
                break;
            }

			// Send whisper MSG to receiver
			sChatHandler.FillMessageData(&data, this, type, lang, NULL, msg.c_str());
			player->GetSession()->SendPacket(&data);

			// Echo whisper back to sender
			sChatHandler.FillMessageData(&data, this, CHAT_MSG_WHISPER_INFORM, lang, NULL,
				msg.c_str(), player->GetGUID());
			SendPacket(&data);
			sLog.outChat(lang, GetPlayer()->GetName(), "Wh", msg.c_str());
        } break;

		case CHAT_MSG_YELL:
        {
            std::string msg;
            recv_data >> msg;
            sChatHandler.FillMessageData(&data, this, type, lang, NULL, msg.c_str() );
            SendPacket(&data);
			GetPlayer()->SendMessageToSet( &data, false );
			sLog.outChat(lang, GetPlayer()->GetName(), "Yell", msg.c_str());
        } break;

		case CHAT_MSG_EMOTE:
		{
			std::string msg;
			recv_data >> msg;
			sChatHandler.FillMessageData(&data, this, type, lang, NULL, msg.c_str() );
			SendPacket(&data);
			GetPlayer()->SendMessageToSet( &data, false );
		} break;

		case CHAT_MSG_PARTY:
        {
            std::string msg;
            recv_data >> msg;
            if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
                break;
            if (GetPlayer()->IsInGroup())
            {
                Group *group = objmgr.GetGroupByLeader(GetPlayer()->GetGroupLeader());
                if (group)
                    group->BroadcastToGroup(this, msg);
            }
			sLog.outChat(lang, GetPlayer()->GetName(), "Party", msg.c_str());
        }

		case CHAT_MSG_GUILD:
        {
            std::string msg;
            recv_data >> msg;
            if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
                break;
			if (GetPlayer()->GetGuildId() > 0)
            {
				Guild *guild = objmgr.GetGuildById(GetPlayer()->GetGuildId());
                if (guild)
					guild->BroadcastToGuild(this, msg);
            }
			sLog.outChat(lang, GetPlayer()->GetName(), "Guild", msg.c_str());
        }

		case CHAT_MSG_AFK:
		{
			//TODO: Working AFK State
			GetPlayer()->ToggleAFK();
			if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK))
				GetPlayer()->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK);
			else
				GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK);

		} break;

		case CHAT_MSG_DND:
		{
			//TODO: Working DND State
			GetPlayer()->ToggleAFK();
			if(GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK))
				GetPlayer()->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK);
			else
				GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAG_AFK);
		} break;

		default:
            sLog.outError("CHAT: unknown msg type %u, lang: %u", type, lang);
    }
}
示例#22
0
void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
{
    WorldPacket data;

    Log::getSingleton().outDebug("CHAT: packet received");

    uint32 type;
    uint32 lang;

    recv_data >> type;
    recv_data >> lang;

    switch(type)
    {
        case CHAT_MSG_SAY:
        {
            std::string msg = "";
            recv_data >> msg;

            if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
                break;

            sChatHandler.FillMessageData( &data, this, type, LANG_UNIVERSAL, NULL, msg.c_str() );
            GetPlayer()->SendMessageToSet( &data, true );
        } break;
        case CHAT_MSG_CHANNEL:
        {
            std::string channel = "", msg = "";
            recv_data >> channel;
            recv_data >> msg;
            Channel *chn = channelmgr.GetChannel(channel.c_str(),GetPlayer()); if(chn) chn->Say(GetPlayer(),msg.c_str());
        } break;
        case CHAT_MSG_WHISPER:
        {
            std::string to = "", msg = "";
            recv_data >> to >> msg;
            sChatHandler.FillMessageData(&data, this, type, LANG_UNIVERSAL, NULL, msg.c_str() );
            Player *player = objmgr.GetPlayer(to.c_str());
            if(!player)
            {
                data.clear();
                msg = "Player '";
                msg += to.c_str();
                msg += "' is not online (Names are case sensitive)";
                sChatHandler.FillSystemMessageData( &data, this ,msg.c_str() );
                SendPacket(&data);
                break;
            }
            player->GetSession()->SendPacket(&data);
            // Sent the to Users id as the channel, this should be fine as it's not used for wisper
            sChatHandler.FillMessageData(&data, this, CHAT_MSG_WHISPER_INFORM, LANG_UNIVERSAL, ((char *)(player->GetGUID())), msg.c_str() );
            SendPacket(&data);
        } break;
        case CHAT_MSG_YELL:
        {
            std::string msg = "";
            recv_data >> msg;

            if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
                break;

            sChatHandler.FillMessageData(&data, this, type, LANG_UNIVERSAL, NULL, msg.c_str() );
            SendPacket(&data);
            sWorld.SendGlobalMessage(&data, this);
        } break;
        case CHAT_MSG_PARTY:
        {
            std::string msg = "";
            recv_data >> msg;

            if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
                break;

            if (GetPlayer()->IsInGroup())
            {
                Group *group = objmgr.GetGroupByLeader(GetPlayer()->GetGroupLeader());
                if (group)
                    group->BroadcastToGroup(this, msg);
            }
        }
        default:
            Log::getSingleton().outError("CHAT: unknown msg type %u, lang: %u", type, lang);
    }
}
示例#23
0
void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data )
{
	CHECK_PACKET_SIZE(recv_data, 9);
	WorldPacket *data;
	if(!_player->IsInWorld())
		return;

	uint32 type;
	int32 lang;

	const char * pMisc = 0;
	const char * pMsg = 0;
	recv_data >> type;
	recv_data >> lang;

	if( lang >= NUM_LANGUAGES )
		return;

	if(GetPlayer()->IsBanned())
	{
		GetPlayer()->BroadcastMessage("You cannot do that when banned.");
		return;
	}

	if(lang != -1 && !GetPermissionCount() && sWorld.flood_lines)
	{
		/* flood detection, wheeee! */
		if(UNIXTIME >= floodTime)
		{
			floodLines = 0;
			floodTime = UNIXTIME + sWorld.flood_seconds;
		}

		if((++floodLines) > sWorld.flood_lines)
		{
			if(sWorld.flood_message)
				_player->BroadcastMessage("Your message has triggered serverside flood protection. You can speak again in %u seconds.", floodTime - UNIXTIME);

			return;
		}
	}

	std::stringstream irctext;
	irctext.rdbuf()->str("");
	std::string msg;
	msg.reserve(256);

	//arghhh STFU. I'm not giving you gold or items NOOB
	switch(type)
	{
	case CHAT_MSG_EMOTE:
	case CHAT_MSG_SAY:
	case CHAT_MSG_YELL:
	case CHAT_MSG_WHISPER:
	case CHAT_MSG_CHANNEL:
		{
			if( m_muted && m_muted >= (uint32)UNIXTIME )
			{
				SystemMessage("Your voice is currently muted by a moderator.");
				return;
			}
		}break;
	}

	switch(type)
	{
	case CHAT_MSG_EMOTE:
		{
			recv_data >> msg;

			if(GetPlayer()->m_modlanguage >=0)
				data = sChatHandler.FillMessageData( CHAT_MSG_EMOTE, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
			else	
				data = sChatHandler.FillMessageData( CHAT_MSG_EMOTE, CanUseCommand('c') ? LANG_UNIVERSAL : lang,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
			GetPlayer()->SendMessageToSet( data, true ,true );

			//sLog.outString("[emote] %s: %s", _player->GetName(), msg.c_str());
			delete data;
			
			pMsg=msg.c_str();
			pMisc=0;

		}break;
	case CHAT_MSG_SAY:
		{
			recv_data >> msg;

			if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
				break;

			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}

			if(GetPlayer()->m_modlanguage >=0)
			{
				data = sChatHandler.FillMessageData( CHAT_MSG_SAY, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
				GetPlayer()->SendMessageToSet( data, true );
			}
			else
			{
				if(lang > 0 && LanguageSkills[lang] && _player->_HasSkillLine(LanguageSkills[lang]) == false)
					return;

				if(lang==0 && !CanUseCommand('c'))
					return;

				data = sChatHandler.FillMessageData( CHAT_MSG_SAY, lang, msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
				SendChatPacket(data, 1, lang, this);
				for(set<Player*>::iterator itr = _player->m_inRangePlayers.begin(); itr != _player->m_inRangePlayers.end(); ++itr)
				{
					(*itr)->GetSession()->SendChatPacket(data, 1, lang, this);
				}
			}

			
			//sLog.outString("[say] %s: %s", _player->GetName(), msg.c_str());
			delete data;
			pMsg=msg.c_str();
			pMisc=0;
		} break;
	case CHAT_MSG_PARTY:
	case CHAT_MSG_RAID:
	case CHAT_MSG_RAID_LEADER:
	case CHAT_MSG_RAID_WARNING:
		{
			recv_data >> msg;

			if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
				break;
			
			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}

			Group *pGroup = _player->GetGroup();
			if(pGroup == NULL) break;
			
			if(GetPlayer()->m_modlanguage >=0)
				data=sChatHandler.FillMessageData( type, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
			else
				data=sChatHandler.FillMessageData( type, (CanUseCommand('c') && lang != -1) ? LANG_UNIVERSAL : lang, msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0);
			if(type == CHAT_MSG_PARTY && pGroup->GetGroupType() == GROUP_TYPE_RAID)
			{
				// only send to that subgroup
				SubGroup * sgr = _player->GetGroup() ?
					_player->GetGroup()->GetSubGroup(_player->GetSubGroup()) : 0;

				if(sgr)
				{
					_player->GetGroup()->Lock();
					for(GroupMembersSet::iterator itr = sgr->GetGroupMembersBegin(); itr != sgr->GetGroupMembersEnd(); ++itr)
					{
						if((*itr)->m_loggedInPlayer)
							(*itr)->m_loggedInPlayer->GetSession()->SendChatPacket(data, 1, lang, this);
					}
					_player->GetGroup()->Unlock();
				}
			}
			else
			{
				SubGroup * sgr;
				for(uint32 i = 0; i < _player->GetGroup()->GetSubGroupCount(); ++i)
				{
					sgr = _player->GetGroup()->GetSubGroup(i);
					_player->GetGroup()->Lock();
					for(GroupMembersSet::iterator itr = sgr->GetGroupMembersBegin(); itr != sgr->GetGroupMembersEnd(); ++itr)
					{
						if((*itr)->m_loggedInPlayer)
							(*itr)->m_loggedInPlayer->GetSession()->SendChatPacket(data, 1, lang, this);
					}
					_player->GetGroup()->Unlock();
				}
			}
			//sLog.outString("[party] %s: %s", _player->GetName(), msg.c_str());
			delete data;
			pMsg=msg.c_str();
			pMisc=0;
		} break;
	case CHAT_MSG_GUILD:
		{
			recv_data >> msg;
			if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
			{
				break;
			}

			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}

			if(_player->m_playerInfo->guild)
				_player->m_playerInfo->guild->GuildChat(msg.c_str(), this, lang);

			pMsg=msg.c_str();
			pMisc=0;
		} break;
	case CHAT_MSG_OFFICER:
		{
			recv_data >> msg;

			if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
				break;

			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}

			if(_player->m_playerInfo->guild)
				_player->m_playerInfo->guild->OfficerChat(msg.c_str(), this, lang);

			pMsg=msg.c_str();
			pMisc=0;
		} break;
	case CHAT_MSG_YELL:
		{
			recv_data >> msg;

			if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
				break;

			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}
			if(lang > 0 && LanguageSkills[lang] && _player->_HasSkillLine(LanguageSkills[lang]) == false)
				return;

			if(lang==0 && !CanUseCommand('c'))
				return;

			if(GetPlayer()->m_modlanguage >=0)
				data = sChatHandler.FillMessageData( CHAT_MSG_YELL, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
			else
				data = sChatHandler.FillMessageData( CHAT_MSG_YELL, (CanUseCommand('c') && lang != -1) ? LANG_UNIVERSAL : lang,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );

			//SendPacket(data);
			//sWorld.SendZoneMessage(data, GetPlayer()->GetZoneId(), this);
			_player->GetMapMgr()->SendChatMessageToCellPlayers(_player, data, 2, 1, lang, this);
			delete data;
			//sLog.outString("[yell] %s: %s", _player->GetName(), msg.c_str());
			pMsg=msg.c_str();
			pMisc=0;
		} break;
	case CHAT_MSG_WHISPER:
		{
			std::string to = "",tmp;
			recv_data >> to >> msg;

			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}
		 
			Player *player = objmgr.GetPlayer(to.c_str(), false);
			if(!player)
			{
				data = new WorldPacket(SMSG_CHAT_PLAYER_NOT_FOUND, to.length() + 1);
				*data << to;
				SendPacket(data);
				delete data;
				break;
			}

			// Check that the player isn't a gm with his status on
			if(!_player->GetSession()->GetPermissionCount() && player->bGMTagOn && player->gmTargets.count(_player) == 0)
			{
				// Send CHAT_MSG_WHISPER_INFORM packet
				WorldPacket *data2;
				data2 = sChatHandler.FillMessageData(CHAT_MSG_WHISPER_INFORM, LANG_UNIVERSAL,msg.c_str(), player->GetGUID(), 0);
				SendPacket(data2);
				delete data2; 
				// Build automated reply
				string Reply = "This Game Master does not currently have an open ticket from you and did not receive your whisper. Please submit a new GM Ticket request if you need to speak to a GM. This is an automatic message.";
				data = sChatHandler.FillMessageData( CHAT_MSG_WHISPER, LANG_UNIVERSAL, Reply.c_str(), player->GetGUID(), 4);
				SendPacket(data);
				delete data;
				break;
			}

			if(lang > 0 && LanguageSkills[lang] && _player->_HasSkillLine(LanguageSkills[lang]) == false)
				return;

			if(lang==0 && !CanUseCommand('c'))
				return;

			if( player->Social_IsIgnoring( _player->GetLowGUID() ) )
			{
				data = sChatHandler.FillMessageData( CHAT_MSG_IGNORED, LANG_UNIVERSAL,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
				SendPacket(data);
				delete data;
			}
			else
			{
				if(GetPlayer()->m_modlanguage >=0)
					data = sChatHandler.FillMessageData( CHAT_MSG_WHISPER, GetPlayer()->m_modlanguage,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );
				else
					data = sChatHandler.FillMessageData( CHAT_MSG_WHISPER, ((CanUseCommand('c') || player->GetSession()->CanUseCommand('c')) && lang != -1) ? LANG_UNIVERSAL : lang,  msg.c_str(), _player->GetGUID(), _player->bGMTagOn ? 4 : 0 );

				player->GetSession()->SendPacket(data);
				delete data;
			}

			//Sent the to Users id as the channel, this should be fine as it's not used for wisper
		  
			data = sChatHandler.FillMessageData(CHAT_MSG_WHISPER_INFORM, LANG_UNIVERSAL,msg.c_str(), player->GetGUID(), 0  );
			SendPacket(data);
			delete data;

			if(player->HasFlag(PLAYER_FLAGS, 0x02))
			{
				// Has AFK flag, autorespond.
				data = sChatHandler.FillMessageData(CHAT_MSG_AFK, LANG_UNIVERSAL,  player->m_afk_reason.c_str(),player->GetGUID(), _player->bGMTagOn ? 4 : 0);
				SendPacket(data);
				delete data;
			}
			else if(player->HasFlag(PLAYER_FLAGS, 0x04))
			{
				// Has DND flag, autorespond.
				data = sChatHandler.FillMessageData(CHAT_MSG_DND, LANG_UNIVERSAL, player->m_afk_reason.c_str(),player->GetGUID(), _player->bGMTagOn ? 4 : 0);
				SendPacket(data);
				delete data;
			}

			//sLog.outString("[whisper] %s to %s: %s", _player->GetName(), to.c_str(), msg.c_str());
			pMsg=msg.c_str();
			pMisc=to.c_str();
		} break;
	case CHAT_MSG_CHANNEL:
		{
			std::string channel = "";
			recv_data >> channel;
			recv_data >> msg;
		 
			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}

			if (sChatHandler.ParseCommands(msg.c_str(), this) > 0)
				break;

			Channel *chn = channelmgr.GetChannel(channel.c_str(),GetPlayer()); 
			if(chn) 
				chn->Say(GetPlayer(),msg.c_str(), NULL, false);

			//sLog.outString("[%s] %s: %s", channel.c_str(), _player->GetName(), msg.c_str());
			pMsg=msg.c_str();
			pMisc=channel.c_str();

		} break;
	case CHAT_MSG_AFK:
		{
			std::string reason;
			recv_data >> reason;
			GetPlayer()->SetAFKReason(reason);

			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}

			/* WorldPacket *data, WorldSession* session, uint32 type, uint32 language, const char *channelName, const char *message*/
			if(GetPlayer()->HasFlag(PLAYER_FLAGS, 0x02))
			{
				GetPlayer()->RemoveFlag(PLAYER_FLAGS, 0x02);
				if(sWorld.GetKickAFKPlayerTime())
					sEventMgr.RemoveEvents(GetPlayer(),EVENT_PLAYER_SOFT_DISCONNECT);
			}
			else
			{
				GetPlayer()->SetFlag(PLAYER_FLAGS, 0x02);
				if(sWorld.GetKickAFKPlayerTime())
					sEventMgr.AddEvent(GetPlayer(),&Player::SoftDisconnect,EVENT_PLAYER_SOFT_DISCONNECT,sWorld.GetKickAFKPlayerTime(),1,0);
			}			
		} break;
	case CHAT_MSG_DND:
		{
			std::string reason;
			recv_data >> reason;
			GetPlayer()->SetAFKReason(reason);

			if(g_chatFilter->Parse(msg) == true)
			{
				SystemMessage("Your chat message was blocked by a server-side filter.");
				return;
			}

			if(GetPlayer()->HasFlag(PLAYER_FLAGS, 0x04))
				GetPlayer()->RemoveFlag(PLAYER_FLAGS, 0x04);
			else
			{
				GetPlayer()->SetFlag(PLAYER_FLAGS, 0x04);
			}		  
		} break;
	default:
		sLog.outError("CHAT: unknown msg type %u, lang: %u", type, lang);
	}

	if(pMsg)
		sHookInterface.OnChat(_player, type, lang, pMsg, pMisc);
}
示例#24
0
void WorldSession::HandleGMTicketCreateOpcode(WorldPacket & recv_data)
{
/*
{CLIENT} Packet: (0xF654) UNKNOWN PacketSize = 34 stamp = 6401313
|------------------------------------------------|----------------|
|00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |0123456789ABCDEF|
|------------------------------------------------|----------------|
|00 00 00 00 B5 41 0A C6 60 FB B3 C2 3D 5A A7 42 |.....A..`...=Z.B|
|74 65 73 74 00 11 00 00 00 00 00 00 00 00 00 00 |test............|
|00 00                                           |..              |
-------------------------------------------------------------------
00 00 00 00 
B5 41 0A C6 
60 FB B3 C2
3D 5A A7 42 
74 65 73 74 00 
11 00 00 00 
00 - text 2
00 00 00 00 - counter
00 00 00 00 - zip size

{CLIENT} Packet: (0xF654) UNKNOWN PacketSize = 1598 TimeStamp = 25375559
12 02 00 00 
72 91 EF C4 
07 88 A7 45 
A8 D6 46 C1 
49 20 68 61 76 65 20 61 20 63 68 61 72 20 6E 61 6D 65 20 73 63 72 65 65 74 68 2E 20 48 61 76 65 6E 27 74 20 70 6C 61 79 65 64 20 6F 6E 20 69 74 20 6F 76 65 72 20 61 20 79 65 61 72 2E 20 57 68 65 6E 20 69 20 74 72 79 20 74 6F 20 6C 6F 67 69 6E 20 69 74 20 73 61 79 73 20 22 79 6F 75 20 63 61 6E 6E 6F 74 20 6C 6F 67 20 69 6E 20 75 6E 74 69 6C 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 75 70 64 61 74 65 20 70 72 6F 63 65 73 73 20 79 6F 75 20 72 65 63 65 6E 74 6C 79 20 69 6E 69 74 69 61 74 65 64 20 69 73 20 63 6F 6D 70 6C 65 74 65 64 22 2E 20 49 20 74 72 69 65 64 20 74 6F 20 67 6F 6F 67 6C 65 20 74 68 69 73 20 61 6E 64 20 66 69 6E 64 20 6F 75 74 20 77 68 61 74 20 69 73 20 68 61 70 70 65 6E 69 6E 67 2E 20 49 20 66 6F 75 6E 64 20 6F 75 74 20 74 68 61 74 20 69 20 69 73 20 70 72 6F 62 61 62 6C 79 20 70 65 6E 64 69 6E 67 20 73 6F 6D 65 20 70 61 69 64 20 73 65 72 76 69 63 65 2E 20 48 6F 77 20 64 6F 20 69 20 63 61 6E 63 65 6C 20 74 68 69 73 20 73 65 72 76 69 63 65 20 3F 20 41 6E 64 20 68 6F 77 20 64 6F 20 69 20 66 69 6E 64 20 77 68 69 63 68 20 73 65 72 76 69 63 65 20 69 73 20 70 65 6E 64 69 6E 67 20 3F 20 49 20 6A 75 73 74 20 77 61 6E 74 20 74 6F 20 75 73 65 20 74 68 61 20 63 68 61 72 20 61 67 61 69 6E 20 3A 28 00
11 00 00 00 
00 
15 00 00 00 
3A 02 00 00 39 02 00 00 39 02 00 00 70 00 00 00 69 00 00 00 
67 00 00 00 66 00 00 00 60 00 00 00 5C 00 00 00 54 00 00 00 
53 00 00 00 33 00 00 00 27 00 00 00 24 00 00 00 1B 00 00 00 
15 00 00 00 
0C 00 00 00 09 00 00 00 06 00 00 00 04 00 00 00 01 00 00 00 
08 11 00 00 78 9C ED 57 5B 6F E2 46 14 EE F3 FE 8A 93 A7 7D 49 D5 F1 95 31 AA 5A D9 D8 10 76 B9 09 9B A2 ED 2A 0F 13 7B C0 D3 D8 1E 34 1E 87 10 E5 AF F5 A9 7F AC 63 48 A2 A2 64 2D D9 4A A5 55 55 90 40 F6 1C 0E DF 77 BE 73 73 74 D8 D1 3E 7C D5 7A D7 97 30 48 49 51 D0 4C 5D 46 82 24 14 7E 84 01 93 07 75 B0 C8 C8 81 0A 98 91 BC B6 5D B3 2C 23 B9 E0 37 54 48 75 18 D2 22 51 87 A3 D5 D8 57 87 48 47 A7 97 61 D8 EE 10 EB CA C0 8D 25 BB A3 B0 3B 3A F9 A7 89 66 7B D8 77 6D 65 12 D1 7B A9 4E E0 31 DE 3C BD 1E AF 98 A4 79 DF 32 90 86 FA E7 6F AC F7 D1 63 FA 35 C8 15 80 92 65 B7 30 C8 B8 4C AF 1F D3 47 71 FD 21 6A CF 67 41 13 C1 4B 52 C4 E9 B7 D9 98 AE 6F 62 A3 1D 9B C9 10 3E C5 B0 08 A3 8B FF 12 2C 9F 3D FC F5 E7 B7 11 E9 BE 6D 0D 0C B7 15 A2 BD BC 81 37 A4 D7 35 6C 9D 09 AF 21 03 6B A6 D5 73 F4 7E 7D 52 E7 40 46 73 5A 48 56 E5 30 17 F4 98 02 E0 A0 ED 4F A5 24 F1 2D EC 4A D9 2D F2 24 95 E4 B6 21 EA 43 07 99 03 A7 65 D4 A7 B0 76 97 30 72 A7 41 78 59 87 1F 00 26 41 F4 31 04 7F 0E E1 7C 1A 80 BB 0C 66 2E 2C 7E 5B 28 58 D3 F9 0C 86 E6 E8 F7 CB FA 1A A6 EE E7 20 84 2F F3 15 B8 E0 05 51 14 2C 61 31 71 BF 04 CB 4E F4 C6 B1 60 B2 12 1B 12 D3 06 8E 81 E5 20 C3 6E C5 71 1D 85 27 1D 11 EA A1 24 79 D1 D1 C1 AF 4A F8 24 DF 42 B0 52 B2 82 C2 15 4B 9E D4 33 1D 67 04 94 D4 01 EA 44 CE CB 58 59 4A 7A DF D0 98 34 CB 74 7B 83 B6 35 E3 85 20 39 0C 04 D9 48 A0 3B 16 83 BF 08 E1 86 66 B2 7B 29 5D F1 7B 56 95 0D 48 FD DE C0 F0 FD B6 48 27 6B D8 33 99 9E A4 20 86 61 51 FA 2C 85 6D 59 E7 42 68 18 39 B6 A1 1B D8 7C D6 C4 17 64 CB 8B 32 26 19 85 09 DD 82 2B 72 2E BA 37 D7 90 57 59 99 12 29 A9 68 48 36 D3 C1 36 46 AD 88 FE BC B8 5B 40 A0 DC 16 EA 6F 7F 01 60 25 64 9C DF B2 62 0B 1B 2E 80 DE C7 74 27 19 2F 48 F6 E4 AD 84 7D CA 81 16 7F F0 03 D4 BF 25 25 E4 55 9C D6 DF 7B 0A 09 BF 50 05 39 AD 4A A9 44 85 9C A8 02 A1 40 8A 04 12 9A B0 98 48 9A 5C D6 66 25 95 50 ED 60 59 DF 00 6F F4 B1 3C DA B8 82 16 04 24 25 79 09 BC 00 5E 09 A8 E3 57 73 AD BD D6 C5 5E 63 52 81 A4 30 2E 36 FC E2 A2 5B C2 8C 38 61 24 6D C8 6D 4B F3 82 1E F2 5A 76 DF F2 8D EE 6B 23 6C E0 B3 54 51 0E 7A 4A 27 D3 B1 9F 53 65 7A 50 95 26 18 AF 4A 18 72 21 2B 55 C8 03 22 92 53 21 AB 38 B8 AB 41 34 56 8D EC 6A BE 0A 03 D0 EC 2D EC 68 B7 2C 5A 65 4A CA A6 42 41 A6 E7 B7 2B E9 F7 69 56 78 D4 AD F2 49 21 88 32 DD 36 68 69 0E 3D E4 58 41 4B 52 D1 1B A4 6C CD 71 CE B5 D4 34 0B EB A6 D3 D3 71 1F 1B 47 76 51 2A 28 05 BE 81 50 F2 82 96 27 7E AF 3D E9 48 33 CE 3D 59 A6 89 B1 ED 68 FA 8B A7 3D AF FD AC C9 5D 93 1B 64 9F B9 B1 D5 16 A3 63 BB A7 BF C2 23 53 0A 6B 56 24 27 5F 75 19 59 97 B8 3E D8 1F 6F FE 3F DF 5F 6F 68 82 E6 19 8F 1B BA 84 EE FA 36 6E C7 4F E1 8D AE 02 58 CE 5D 1F DC 91 3B 9E 7D 3F D0 C6 F0 69 A5 C2 BD 76 67 11 44 73 18 05 11 BC 0F DA 7F AB 4A 05 DD A9 76 49 93 4E A0 96 6A E0 90 8C 14 0D 90 7C 8C 3D CF 6A 05 49 72 0E 37 24 81 03 AF 20 61 C9 B1 EA 4A AE 66 E9 5E A8 CF 4E 40 D5 53 19 2F 1E 9A A4 76 5C CB 6B 37 AB 12 5E C8 7A 94 6E D5 18 56 DB 58 7C 88 33 D5 AD 14 D2 9C BE 4C 79 35 CF 09 24 A2 52 2C 58 01 7B 22 60 AB 00 9D 06 75 AA 9A D2 89 9B DA 90 D4 EC 3F 8E EC EF 27 93 67 F3 8E 8B C1 52 AA B9 5B 35 2D 58 6E 80 CD 76 29 F1 1E 03 D2 42 A8 DE E6 3B 71 9A AA FE 9E 91 5D D9 F0 90 62 A1 A1 E3 1B ED 16 E4 8D B9 7D F8 F5 98 E7 F9 D3 B2 A7 E9 D7 1F 7E F8 1B A7 46 13 DF 
//above is a compressed something that translates to this
Type: [17], Channel: [Trade - City], Player Name: [Willamrobert], Sender GUID: [020000000336AF82], Active player: [02000000016B8DA6], Text: [ |cffffffff|Hitem:53010:0:0:0:0:0:0:0:82:0|h[Embersilk Cloth]|h|r] Type: [17], Channel: [Trade - City], Player Name: [Pedrosanch], Sender GUID: [0200000004AD4832], Active player: [02000000016B8DA6], Text: [LF Jc PST!] Type: [17], Channel: [Trade - City], Player Name: [Pedrosanch], Sender GUID: [0200000004AD4832], Active player: [02000000016B8DA6], Text: [LF Jc PST!] Type: [17], Channel: [Trade - City], Player Name: [Dizý], Sender GUID: [0200000002D65C3A], Active player: [02000000016B8DA6], Text: [wtb |cffffffff|Hitem:52185:0:0:0:0:0:0:1038145792:85:0|h[Elementium Ore]|h|r 90g/stack pst] Type: [17], Channel: [Trade - City], Player Name: [Pahtak], Sender GUID: [0200000004F904C9], Active player: [02000000016B8DA6], Text: [LFM WAR GAMES, PST LET'S DO SOME ARENA PVP- CMON F4GZ, PVP MAKES YOU A BETTER PLAYER] Type: [17], Channel: [Trade - City], Player Name: [Icriturface], Sender GUID: [0200000004E59036], Active player: [02000000016B8DA6], Text: [WTS |cff0070dd|Hitem:52980:0:0:0:0:0:0:0:85:0|h[Pristine Hide]|h|r 499G ea PST] Type: [17], Channel: [Trade - City], Player Name: [Blisstex], Sender GUID: [0200000003154A7C], Active player: [02000000016B8DA6], Text: [LF BS to Craft epic DPS belt PST!] Type: [17], Channel: [Trade - City], Player Name: [Hoxius], Sender GUID: [0200000003D7C3DD], Active player: [02000000016B8DA6], Text: [LF LW with |cffa335ee|Hitem:56550:0:0:0:0:0:0:1809632384:85:0|h[Dragonscale Leg Armor]|h|r] Type: [17], Channel: [Trade - City], Player Name: [Soulshatter], Sender GUID: [0200000004498680], Active player: [02000000016B8DA6], Text: [ is looking for exceptional players who enjoy PvP as much as we do! Must be mature and dedicated, we set up Rated BG's and Arena teams on our calender! PST for more Info!!!] Type: [17], Channel: [Trade - City], Player Name: [Goaiahx], Sender GUID: [02000000051BE70B], Active player: [02000000016B8DA6], Text: [wts |cffffffff|Hitem:60838:0:0:0:0:0:0:2007498496:85:0|h[Mysterious Fortune Card]|h|r on AUCTION HOUSE 16g per] Type: [17], Channel: [Trade - City], Player Name: [Ultio], Sender GUID: [0200000003D04BDC], Active player: [02000000016B8DA6], Text: [WTS |cff0070dd|Hitem:52980:0:0:0:0:0:0:0:85:0|h[Pristine Hide]|h|r 498G] Type: [17], Channel: [Trade - City], Player Name: [Hanrahangx], Sender GUID: [0200000004FB095E], Active player: [02000000016B8DA6], Text: [WTT |cff0070dd|Hitem:61998:0:0:0:0:0:0:1158249728:83:0|h[Three of Stones]|h|r |cff0070dd|Hitem:62013:0:0:0:0:0:0:1544886912:83:0|h[Two of Waves]|h|r |cff0070dd|Hitem:62006:0:0:0:0:0:0:683228672:83:0|h[Three of the Winds]|h|rfor 5,8 of winds] Type: [17], Channel: [Trade - City], Player Name: [Pahtak], Sender GUID: [0200000004F904C9], Active player: [02000000016B8DA6], Text: [LFM WAR GAMES, PST LET'S DO SOME ARENA PVP- CMON F4GZ, PVP MAKES YOU A BETTER PLAYER] Type: [17], Channel: [Trade - City], Player Name: [Dremloc], Sender GUID: [02000000052AD689], Active player: [02000000016B8DA6], Text: [ON THE ROAD AGAIN] Type: [17], Channel: [Trade - City], Player Name: [Dremloc], Sender GUID: [02000000052AD689], Active player: [02000000016B8DA6], Text: [I JUST WANT TO GET ON THE ROAD AGAIN] Type: [17], Channel: [Trade - City], Player Name: [Hanrahangx], Sender GUID: [0200000004FB095E], Active player: [02000000016B8DA6], Text: [reported] Type: [17], Channel: [Trade - City], Player Name: [Randalan], Sender GUID: [0200000004D88BB5], Active player: [02000000016B8DA6], Text: [too bad you did the song wrong] Type: [17], Channel: [Trade - City], Player Name: [Cloonz], Sender GUID: [020000000529A5BB], Active player: [02000000016B8DA6], Text: [dont forget to cyclone some players as a druid in war games and have the switch teams] Type: [17], Channel: [Trade - City], Player Name: [Dremloc], Sender GUID: [02000000052AD689], Active player: [02000000016B8DA6], Text: [NO!!] Type: [17], Channel: [Trade - City], Player Name: [Rtardu], Sender GUID: [02000000044AE845], Active player: [02000000016B8DA6], Text: [WTS |cff0070dd|Hitem:52980:0:0:0:0:0:0:0:85:0|h[Pristine Hide]|h|r 500G ea] Type: [17], Channel: [Trade - City], Player Name: [Mindlapse], Sender GUID: [02000000050F9D3D], Active player: [02000000016B8DA6], Text: [f4gz? you must be 12] 
*/
	uint32 map;
	float x, y, z;
	std::string message = "";
	GM_Ticket *ticket = new GM_Ticket;

	// recv Data
	recv_data >> map;
	recv_data >> x;
	recv_data >> y;
	recv_data >> z;
	recv_data >> message; 
	//not using this atm
/*
	uint32 always17;
	uint32 somecounter;
	uint32 zip_size;
	std::string message2 = "";
	recv_data >> always17;
	recv_data >> message2;
	recv_data >> somecounter;
	for(uint32 i=0;i<somecounter;i++)
	{
		uint32 unkvalues;
		recv_data >> unkvalues;
	}
	recv_data >> zip_size;
	recv_data >> zip_content;
*/

	// Remove pending tickets
	objmgr.RemoveGMTicketByPlayer(GetPlayer()->GetGUID());

	ticket->guid = objmgr.GenerateTicketID();
	ticket->playerGuid = GetPlayer()->GetGUID();
	ticket->map = map;
	ticket->posX = x;
	ticket->posY = y;
	ticket->posZ = z;
	ticket->message = message;
	ticket->timestamp = (uint32)UNIXTIME;
	ticket->name = GetPlayer()->GetName();
	ticket->level = GetPlayer()->getLevel();
	ticket->deleted_by = 0;
	ticket->assignedToPlayer = 0;
	ticket->comment = "";

	// Add a new one
	objmgr.AddGMTicket(ticket, false);

	// Response - no errors
	sStackWorldPacket( data, SMSG_GMTICKET_CREATE, 10 );
	data << uint32(2);

	SendPacket(&data);

	// send message indicating new ticket
	Channel *chn = channelmgr.GetChannel(sWorld.getGmClientChannel().c_str(),GetPlayer());
	if(chn)
	{
		std::stringstream ss;
#ifdef GM_TICKET_MY_MASTER_COMPATIBLE
		ss << "GmTicket 5, " << ticket->name;
#else
		ss << "GmTicket:" << GM_TICKET_CHAT_OPCODE_NEWTICKET;
		ss << ":" << ticket->guid;
		ss << ":" << ticket->level;
		ss << ":" << ticket->name;
#endif
		chn->Say(_player, ss.str().c_str(), NULL, true);
	}
}