Beispiel #1
0
void WorldSession::HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chatMessage)
{
    ChatMsg type;

    switch (chatMessage.GetOpcode())
    {
        case CMSG_CHAT_MESSAGE_SAY:
            type = CHAT_MSG_SAY;
            break;
        case CMSG_CHAT_MESSAGE_YELL:
            type = CHAT_MSG_YELL;
            break;
        case CMSG_CHAT_MESSAGE_GUILD:
            type = CHAT_MSG_GUILD;
            break;
        case CMSG_CHAT_MESSAGE_OFFICER:
            type = CHAT_MSG_OFFICER;
            break;
        case CMSG_CHAT_MESSAGE_PARTY:
            type = CHAT_MSG_PARTY;
            break;
        case CMSG_CHAT_MESSAGE_RAID:
            type = CHAT_MSG_RAID;
            break;
        case CMSG_CHAT_MESSAGE_RAID_WARNING:
            type = CHAT_MSG_RAID_WARNING;
            break;
        case CMSG_CHAT_MESSAGE_INSTANCE_CHAT:
            type = CHAT_MSG_INSTANCE_CHAT;
            break;
        default:
            TC_LOG_ERROR("network", "HandleMessagechatOpcode : Unknown chat opcode (%u)", chatMessage.GetOpcode());
            return;
    }

    HandleChatMessage(type, chatMessage.Language, chatMessage.Text);
}
Beispiel #2
0
	void ServerSession::Update(const GameTime& gameTime)
	{
		// Update the server
		mServer->Update();
		
		// Handle all messages
		Network::SlotMessage message;
		while ((message = mServer->PopMessage()).mMessage != NULL)
		{
			// Get the player this message is about
			//PlayerID slot = GetPlayerID(message.mSlot);

			// If we've received a message, update timeout (unless they're marked to be removed)
			if (std::find(mClientsToRemove.begin(), mClientsToRemove.end(), message.mSlot) == mClientsToRemove.end())
			{
				mClientTimeout[message.mSlot] = C_TIMEOUT;
			}

			// Parse the message content
			switch (message.mMessage->ID())
			{
				case Network::C_MESSAGE_CHAT:
				{
					Network::ChatMessage* m = static_cast<Network::ChatMessage*>(message.mMessage);

					HandleChatMessage(m->mSourceID, m->mTargetID, m->mRecipient, m->mMessage);
				} break;

				case Network::C_MESSAGE_JOIN:
				{
					Network::JoinMessage* m = static_cast<Network::JoinMessage*>(message.mMessage);
				
					HandleJoinMessage(message.mSlot, m->mName);
				} break;
				
				case Network::C_MESSAGE_LEAVE_GAME:
				{
					Network::LeaveGameMessage* m = static_cast<Network::LeaveGameMessage*>(message.mMessage);

					// Do we need this? Notice this on timeout instead?
				} break;

				case Network::C_MESSAGE_PLACE_PIECE:
				{
					Network::PlacePieceMessage* m = static_cast<Network::PlacePieceMessage*>(message.mMessage);

					// If the move is valid, add the marker and move to the next player
					if (mGrid.GetMarkerInCell(m->mX, m->mY) == C_PLAYER_NONE)
					{
						if (mCurrentPlayer == m->mPlayerID)
						{
							mGrid.AddMarker(Logic::Cell(m->mX, m->mY), m->mPlayerID);
							if (mSessionNotifiee != NULL)
								mSessionNotifiee->PlacePiece(m->mPlayerID, Logic::Cell(m->mX, m->mY));

							mServer->Send(Network::PlacePieceMessage(m->mPlayerID, m->mX, m->mY, -1));

							if (!CheckAndHandleWin())
							{
								mCurrentPlayer = mRuleset->GetNextPlayer(mCurrentPlayer);
							}
						}
					}
					
					mServer->Send(Network::TurnMessage(mCurrentPlayer));
				} break;

				case Network::C_MESSAGE_SET_TEAM:
				{
					Network::SetTeamMessage* m = static_cast<Network::SetTeamMessage*>(message.mMessage);

					assert(mPlayers[m->mPlayerID] != NULL);
					assert(m->mTeam >= C_TEAM_NONE);
					assert(m->mTeam < 2);

					if (GetPlayerSlot(message.mSlot) == m->mPlayerID)
					{
						mPlayers[m->mPlayerID]->SetTeam(m->mTeam);

						if (mSessionNotifiee != NULL)
							mSessionNotifiee->SetTeam(m->mPlayerID, m->mTeam);

						mServer->Send(Network::SetTeamMessage(m->mPlayerID, m->mTeam));
					}
				} break;

				case Network::C_MESSAGE_HIGHLIGHT:
				{
					Network::HighlightMessage* m = static_cast<Network::HighlightMessage*>(message.mMessage);
					PlayerID source = GetPlayerSlot(message.mSlot);

					for (PlayerID s = 0; s < mPlayers.size(); ++s)
					{
						if (mPlayers[s]->GetTeam() == mPlayers[source]->GetTeam() && s != source)
						{
							if (mPlayerClients[s] >= 0)
							{
								// Remote
								mServer->Send(Network::HighlightMessage(m->mX, m->mY, m->mType));
							}
							else
							{
								// Local
								if (mSessionNotifiee != NULL)
									mSessionNotifiee->SetHighlightedCell(Logic::Cell(m->mX, m->mY), m->mType);
							}
						}
					}
				} break;
			}

			SafeDelete(message.mMessage);
		}

		// Decrease timeout
		float dt = gameTime.GetTimeSinceLastTick().Seconds;
		for (TimeoutMap::iterator it = mClientTimeout.begin(); it != mClientTimeout.end(); it++)
		{
			it->second -= dt;
			if (it->second <= 0.0f && mServer->IsConnected(it->first))
			{
				// TODO: Enable timeout again
				mServer->DisconnectClient(it->first);
			}
		}
	}
Beispiel #3
0
void WorldSession::HandleChatMessageEmoteOpcode(WorldPackets::Chat::ChatMessageEmote& chatMessageEmote)
{
    HandleChatMessage(CHAT_MSG_EMOTE, LANG_UNIVERSAL, chatMessageEmote.Text);
}
Beispiel #4
0
void WorldSession::HandleChatMessageChannelOpcode(WorldPackets::Chat::ChatMessageChannel& chatMessageChannel)
{
    HandleChatMessage(CHAT_MSG_CHANNEL, chatMessageChannel.Language, chatMessageChannel.Text, chatMessageChannel.Target);
}
Beispiel #5
0
void WorldSession::HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& chatMessageWhisper)
{
    HandleChatMessage(CHAT_MSG_WHISPER, chatMessageWhisper.Language, chatMessageWhisper.Text, chatMessageWhisper.Target);
}
Beispiel #6
0
// Handle packet data
void _Server::HandlePacket(_Buffer &Data, _Peer *Peer) {
	PacketType Type = Data.Read<PacketType>();

	switch(Type) {
		case PacketType::ACCOUNT_LOGININFO:
			HandleLoginInfo(Data, Peer);
		break;
		case PacketType::CHARACTERS_REQUEST:
			HandleCharacterListRequest(Data, Peer);
		break;
		case PacketType::CHARACTERS_PLAY:
			HandleCharacterPlay(Data, Peer);
		break;
		case PacketType::CREATECHARACTER_INFO:
			HandleCharacterCreate(Data, Peer);
		break;
		case PacketType::CHARACTERS_DELETE:
			HandleCharacterDelete(Data, Peer);
		break;
		case PacketType::WORLD_MOVECOMMAND:
			HandleMoveCommand(Data, Peer);
		break;
		case PacketType::WORLD_RESPAWN:
			HandleRespawn(Data, Peer);
		break;
		case PacketType::ACTION_USE:
			HandleActionUse(Data, Peer);
		break;
		case PacketType::CHAT_MESSAGE:
			HandleChatMessage(Data, Peer);
		break;
		case PacketType::INVENTORY_MOVE:
			HandleInventoryMove(Data, Peer);
		break;
		case PacketType::INVENTORY_USE:
			HandleInventoryUse(Data, Peer);
		break;
		case PacketType::INVENTORY_SPLIT:
			HandleInventorySplit(Data, Peer);
		break;
		case PacketType::VENDOR_EXCHANGE:
			HandleVendorExchange(Data, Peer);
		break;
		case PacketType::TRADER_ACCEPT:
			HandleTraderAccept(Data, Peer);
		break;
		case PacketType::ACTIONBAR_CHANGED:
			HandleActionBarChanged(Data, Peer);
		break;
		case PacketType::SKILLS_SKILLADJUST:
			HandleSkillAdjust(Data, Peer);
		break;
		case PacketType::TRADE_REQUEST:
			HandleTradeRequest(Data, Peer);
		break;
		case PacketType::TRADE_CANCEL:
			HandleTradeCancel(Data, Peer);
		break;
		case PacketType::TRADE_GOLD:
			HandleTradeGold(Data, Peer);
		break;
		case PacketType::TRADE_ACCEPT:
			HandleTradeAccept(Data, Peer);
		break;
		case PacketType::PLAYER_STATUS:
			HandlePlayerStatus(Data, Peer);
		break;
		default:
		break;
	}
}