예제 #1
0
std::string ChatHandler::PGetParseString(int32 entry, ...)
{
    const char *format = GetArkCoreString(entry);
    va_list ap;
    char str [1024];
    va_start(ap, entry);
    vsnprintf(str, 1024, format, ap);
    va_end(ap);
    return (std::string)str;
}
예제 #2
0
void WorldSession::SendNotification(uint32 string_id, ...) {
	char const* format = GetArkCoreString(string_id);
	if (format) {
		va_list ap;
		char szStr[1024];
		szStr[0] = '\0';
		va_start(ap, string_id);
		vsnprintf(szStr, 1024, format, ap);
		va_end(ap);

		WorldPacket data(SMSG_NOTIFICATION, (strlen(szStr) + 1));
		data << szStr;
		SendPacket(&data);
	}
}
예제 #3
0
//this void causes that auction window is opened
void WorldSession::SendAuctionHello(uint64 guid, Creature* unit) {
	if (GetPlayer()->getLevel()
			< sWorld->getIntConfig(CONFIG_AUCTION_LEVEL_REQ)) {
		SendNotification(GetArkCoreString(LANG_AUCTION_REQ),
				sWorld->getIntConfig(CONFIG_AUCTION_LEVEL_REQ));
		return;
	}

	AuctionHouseEntry const* ahEntry = AuctionHouseMgr::GetAuctionHouseEntry(
			unit->getFaction());
	if (!ahEntry)
		return;

	WorldPacket data(MSG_AUCTION_HELLO, 12);
	data << uint64(guid);
	data << uint32(ahEntry->houseId);
	data << uint8(1); // 3.3.3: 1 - AH enabled, 0 - AH disabled
	SendPacket(&data);
}
예제 #4
0
void WorldSession::SendNameQueryOpcodeFromDBCallBack(QueryResult result) {
	if (!result)
		return;

	Field *fields = result->Fetch();
	uint32 guid = fields[0].GetUInt32();
	std::string name = fields[1].GetString();
	uint8 pRace = 0, pGender = 0, pClass = 0;
	if (name == "")
		name = GetArkCoreString(LANG_NON_EXIST_CHARACTER);
	else {
		pRace = fields[2].GetUInt8();
		pGender = fields[3].GetUInt8();
		pClass = fields[4].GetUInt8();
	}
	// guess size
	WorldPacket data(SMSG_NAME_QUERY_RESPONSE,
			(8 + 1 + 1 + 1 + 1 + 1 + 1 + 10));
	data.appendPackGUID(MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER));
	data << uint8(0); // added in 3.1
	data << name;
	data << uint8(0); // realm name for cross realm BG usage
	data << uint8(pRace); // race
	data << uint8(pGender); // gender
	data << uint8(pClass); // class

	// if the first declined name field (5) is empty, the rest must be too
	if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED)
			&& fields[5].GetString() != "") {
		data << uint8(1); // is declined
		for (int i = 5; i < MAX_DECLINED_NAME_CASES + 5; ++i)
			data << fields[i].GetString();
	} else
		data << uint8(0); // is not declined

	SendPacket(&data);
}
예제 #5
0
void WorldSession::SendTrainerList (uint64 guid)
{
    std::string str = GetArkCoreString(LANG_NPC_TAINER_HELLO);
    SendTrainerList(guid, str);
}
예제 #6
0
void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data) {
	uint32 type = 0;
	uint32 lang;

	// Les types sont maintenant ger�s par opcode, un opcode par type
	// Changement en place depuis la 4.0.1 13164
	switch (recv_data.GetOpcode()) {
	case CMSG_MESSAGECHAT_SAY:
		type = CHAT_MSG_SAY;
		break;
	case CMSG_MESSAGECHAT_YELL:
		type = CHAT_MSG_YELL;
		break;
	case CMSG_MESSAGECHAT_CHANNEL:
		type = CHAT_MSG_CHANNEL;
		break;
	case CMSG_MESSAGECHAT_WHISPER:
		type = CHAT_MSG_WHISPER;
		break;
	case CMSG_MESSAGECHAT_GUILD:
		type = CHAT_MSG_GUILD;
		break;
	case CMSG_MESSAGECHAT_OFFICER:
		type = CHAT_MSG_OFFICER;
		break;
	case CMSG_MESSAGECHAT_AFK:
		type = CHAT_MSG_AFK;
		break;
	case CMSG_MESSAGECHAT_DND:
		type = CHAT_MSG_DND;
		break;
	case CMSG_MESSAGECHAT_EMOTE:
		type = CHAT_MSG_EMOTE;
		break;
	case CMSG_MESSAGECHAT_PARTY:
		type = CHAT_MSG_PARTY;
		break;
	case CMSG_MESSAGECHAT_PARTY_LEADER:
		type = CHAT_MSG_PARTY_LEADER;
		break;
	case CMSG_MESSAGECHAT_RAID:
		type = CHAT_MSG_RAID;
		break;
	case CMSG_MESSAGECHAT_RAID_LEADER:
		type = CHAT_MSG_RAID_LEADER;
		break;
	case CMSG_MESSAGECHAT_BATTLEGROUND:
		type = CHAT_MSG_BATTLEGROUND;
		break;
	case CMSG_MESSAGECHAT_BATTLEGROUND_LEADER:
		type = CHAT_MSG_BATTLEGROUND_LEADER;
		break;
	case CMSG_MESSAGECHAT_RAID_WARNING:
		type = CHAT_MSG_RAID_WARNING;
		break;
	default:
		sLog->outDetail("HandleMessagechatOpcode : Unknown chat opcode (%u)",
				recv_data.GetOpcode());
		recv_data.hexlike();
		return;
	}

	// no language for AFK and DND messages
	if (type == CHAT_MSG_AFK) {
		std::string msg;
		recv_data >> msg;

		if ((msg.empty() || !_player->isAFK()) && !_player->isInCombat()) {
			if (!_player->isAFK()) {
				if (msg.empty())
					msg = GetArkCoreString(LANG_PLAYER_AFK_DEFAULT);
				_player->afkMsg = msg;
			}

			sScriptMgr->OnPlayerChat(_player, type, LANG_UNIVERSAL, msg);

			_player->ToggleAFK();
			if (_player->isAFK() && _player->isDND())
				_player->ToggleDND();
		}
		return;
	} else if (type == CHAT_MSG_DND) {
예제 #7
0
void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) {
	if (GetPlayer()->m_trade)
		return;

	uint64 ID;

	if (!GetPlayer()->isAlive()) {
		SendTradeStatus(TRADE_STATUS_YOU_DEAD);
		return;
	}

	if (GetPlayer()->HasUnitState(UNIT_STAT_STUNNED)) {
		SendTradeStatus(TRADE_STATUS_YOU_STUNNED);
		return;
	}

	if (isLogingOut()) {
		SendTradeStatus(TRADE_STATUS_YOU_LOGOUT);
		return;
	}

	if (GetPlayer()->isInFlight()) {
		SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR);
		return;
	}

	if (GetPlayer()->getLevel()
			< sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) {
		SendNotification(GetArkCoreString(LANG_TRADE_REQ),
				sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ));
		return;
	}

	recvPacket >> ID;

	Player* pOther = ObjectAccessor::FindPlayer(ID);

	if (!pOther) {
		SendTradeStatus(TRADE_STATUS_NO_TARGET);
		return;
	}

	if (pOther == GetPlayer() || pOther->m_trade) {
		SendTradeStatus(TRADE_STATUS_BUSY);
		return;
	}

	if (!pOther->isAlive()) {
		SendTradeStatus(TRADE_STATUS_TARGET_DEAD);
		return;
	}

	if (pOther->isInFlight()) {
		SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR);
		return;
	}

	if (pOther->HasUnitState(UNIT_STAT_STUNNED)) {
		SendTradeStatus(TRADE_STATUS_TARGET_STUNNED);
		return;
	}

	if (pOther->GetSession()->isLogingOut()) {
		SendTradeStatus(TRADE_STATUS_TARGET_LOGOUT);
		return;
	}

	if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUIDLow())) {
		SendTradeStatus(TRADE_STATUS_IGNORE_YOU);
		return;
	}

	if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE)
			&& pOther->GetTeam() != _player->GetTeam()) {
		SendTradeStatus(TRADE_STATUS_WRONG_FACTION);
		return;
	}

	if (!pOther->IsWithinDistInMap(_player, 10.0f, false)) {
		SendTradeStatus(TRADE_STATUS_TARGET_TO_FAR);
		return;
	}

	if (pOther->getLevel() < sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ)) {
		SendNotification(GetArkCoreString(LANG_TRADE_OTHER_REQ),
				sWorld->getIntConfig(CONFIG_TRADE_LEVEL_REQ));
		return;
	}

	// OK start trade
	_player->m_trade = new TradeData(_player, pOther);
	pOther->m_trade = new TradeData(pOther, _player);

	WorldPacket data(SMSG_TRADE_STATUS, 1 + 8 + 4 + 4 + 4 + 1 + 4 + 4 + 4);
	data << uint8(0);
	data << uint64(_player->GetGUID());
	data << uint32(0);
	data << uint32(TRADE_STATUS_BEGIN_TRADE);
	data << uint32(0);
	data << uint8(0);
	data << uint32(0);
	data << uint32(0);
	data << uint32(0);
	pOther->GetSession()->SendPacket(&data);
}