event more pointers, now everything works
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/hilnius@13182 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
@@ -56,20 +56,20 @@ Event::Event(ENetEvent* event)
|
||||
enet_packet_destroy(m_packet); // we got all we need, just remove the data.
|
||||
|
||||
std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers();
|
||||
peer = NULL;
|
||||
peer = new STKPeer*;
|
||||
for (unsigned int i = 0; i < peers.size(); i++)
|
||||
{
|
||||
if (peers[i]->m_peer == event->peer)
|
||||
{
|
||||
peer = peers[i];
|
||||
*peer = peers[i];
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (peer == NULL) // peer does not exist, create him
|
||||
if (*peer == NULL) // peer does not exist, create him
|
||||
{
|
||||
STKPeer* new_peer = new STKPeer();
|
||||
new_peer->m_peer = event->peer;
|
||||
peer = new_peer;
|
||||
*peer = new_peer;
|
||||
Log::verbose("Event", "Creating a new peer, address are STKPeer:%ld, Peer:%ld", (long int)(new_peer), (long int)(event->peer));
|
||||
}
|
||||
}
|
||||
@@ -79,7 +79,7 @@ Event::Event(const Event& event)
|
||||
m_packet = NULL;
|
||||
data = event.data;
|
||||
// copy the peer
|
||||
peer = new STKPeer(*event.peer);
|
||||
peer = event.peer;
|
||||
type = event.type;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,8 +66,8 @@ class Event
|
||||
void removeFront(int size);
|
||||
|
||||
EVENT_TYPE type; //!< Type of the event.
|
||||
NetworkString data; //!< Copy of the data passed by the event.
|
||||
STKPeer* peer; //!< Pointer to the peer that triggered that event.
|
||||
NetworkString data; //!< Copy of the data passed by the event.
|
||||
STKPeer** peer; //!< Pointer to the peer that triggered that event.
|
||||
|
||||
private:
|
||||
ENetPacket* m_packet; //!< A pointer on the ENetPacket to be deleted.
|
||||
|
||||
@@ -89,17 +89,16 @@ void NetworkManager::setManualSocketsMode(bool manual)
|
||||
void NetworkManager::notifyEvent(Event* event)
|
||||
{
|
||||
Log::info("NetworkManager", "EVENT received of type %d", (int)(event->type));
|
||||
|
||||
STKPeer* peer = *event->peer;
|
||||
if (event->type == EVENT_TYPE_CONNECTED)
|
||||
{
|
||||
Log::info("NetworkManager", "A client has just connected. There are now %lu peers.", m_peers.size() + 1);
|
||||
Log::verbose("NetworkManager", "Address of event->peer after connection : %ld", (long int)(event->peer));
|
||||
// create the new peer:
|
||||
m_peers.push_back(event->peer);
|
||||
m_peers.push_back(peer);
|
||||
}
|
||||
if (event->type == EVENT_TYPE_MESSAGE)
|
||||
{
|
||||
uint32_t addr = event->peer->getAddress();
|
||||
uint32_t addr = peer->getAddress();
|
||||
Log::info("NetworkManager", "Message, Sender : %i.%i.%i.%i, message = \"%s\"",
|
||||
((addr>>24)&0xff),
|
||||
((addr>>16)&0xff),
|
||||
@@ -113,20 +112,24 @@ void NetworkManager::notifyEvent(Event* event)
|
||||
|
||||
if (event->type == EVENT_TYPE_DISCONNECTED)
|
||||
{
|
||||
Log::debug("NetworkManager", "Disconnected host: %i.%i.%i.%i:%i", event->peer->getAddress()>>24&0xff, event->peer->getAddress()>>16&0xff, event->peer->getAddress()>>8&0xff, event->peer->getAddress()&0xff,event->peer->getPort());
|
||||
Log::debug("NetworkManager", "Disconnected host: %i.%i.%i.%i:%i",
|
||||
peer->getAddress()>>24&0xff,
|
||||
peer->getAddress()>>16&0xff,
|
||||
peer->getAddress()>>8&0xff,
|
||||
peer->getAddress()&0xff,
|
||||
peer->getPort());
|
||||
// remove the peer:
|
||||
bool removed = false;
|
||||
for (unsigned int i = 0; i < m_peers.size(); i++)
|
||||
{
|
||||
Log::error("NetworkManager", "Saved : %ld, Sender : %ld", (long int)(m_peers[i]), (long int)(event->peer));
|
||||
if (m_peers[i]->isSamePeer(event->peer) && !removed) // remove only one
|
||||
if (m_peers[i]->isSamePeer(peer) && !removed) // remove only one
|
||||
{
|
||||
delete m_peers[i];
|
||||
m_peers.erase(m_peers.begin()+i, m_peers.begin()+i+1);
|
||||
Log::verbose("NetworkManager", "The peer has been removed from the Network Manager.");
|
||||
removed = true;
|
||||
}
|
||||
else if (m_peers[i]->isSamePeer(event->peer))
|
||||
else if (m_peers[i]->isSamePeer(peer))
|
||||
{
|
||||
Log::fatal("NetworkManager", "Multiple peers match the disconnected one.");
|
||||
}
|
||||
|
||||
@@ -261,8 +261,7 @@ void ProtocolManager::update()
|
||||
Log::debug("ProtocolManager", "Message is \"%s\"", event->data.c_str());
|
||||
}
|
||||
|
||||
// because we made a copy of the event and the peer
|
||||
delete event->peer;
|
||||
// because we made a copy of the event
|
||||
delete event;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,10 +58,11 @@ void ClientLobbyRoomProtocol::requestKartSelection(std::string kart_name)
|
||||
void ClientLobbyRoomProtocol::notifyEvent(Event* event)
|
||||
{
|
||||
assert(m_setup); // assert that the setup exists
|
||||
STKPeer* peer = *(event->peer);
|
||||
if (event->type == EVENT_TYPE_MESSAGE)
|
||||
{
|
||||
assert(event->data.size()); // assert that data isn't empty
|
||||
Log::verbose("ClientLobbyRoomProtocol", "Message from %u : \"%s\"", event->peer->getAddress(), event->data.c_str());
|
||||
Log::verbose("ClientLobbyRoomProtocol", "Message from %u : \"%s\"", peer->getAddress(), event->data.c_str());
|
||||
uint8_t message_type = event->data.getAndRemoveUInt8();
|
||||
|
||||
if (message_type == 0x01) // new player connected
|
||||
@@ -203,6 +204,7 @@ void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
|
||||
Log::error("ClientLobbyRoomProtocol", "A message notifying an accepted connection wasn't formated as expected.");
|
||||
return;
|
||||
}
|
||||
STKPeer* peer = *(event->peer);
|
||||
|
||||
NetworkPlayerProfile* profile = new NetworkPlayerProfile();
|
||||
profile->kart_name = "";
|
||||
@@ -214,8 +216,8 @@ void ClientLobbyRoomProtocol::connectionAccepted(Event* event)
|
||||
Log::info("ClientLobbyRoomProtocol", "The server accepted the connection.");
|
||||
profile->user_profile = CurrentOnlineUser::get();
|
||||
m_setup->addPlayer(profile);
|
||||
event->peer->setClientServerToken(token);
|
||||
m_server = event->peer;
|
||||
peer->setClientServerToken(token);
|
||||
m_server = *(event->peer);
|
||||
m_state = CONNECTED;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,11 +164,12 @@ void ServerLobbyRoomProtocol::update()
|
||||
|
||||
void ServerLobbyRoomProtocol::kartDisconnected(Event* event)
|
||||
{
|
||||
STKPeer* peer = *(event->peer);
|
||||
Log::info("ServerLobbyRoomProtocol", "Player disconnected.");
|
||||
if (event->peer->getPlayerProfile() != NULL) // others knew him
|
||||
if (peer->getPlayerProfile() != NULL) // others knew him
|
||||
{
|
||||
NetworkString msg;
|
||||
msg.ai8(0x02).ai8(1).ai8(event->peer->getPlayerProfile()->race_id);
|
||||
msg.ai8(0x02).ai8(1).ai8(peer->getPlayerProfile()->race_id);
|
||||
m_listener->sendMessage(this, msg);
|
||||
}
|
||||
else
|
||||
@@ -189,6 +190,7 @@ void ServerLobbyRoomProtocol::kartDisconnected(Event* event)
|
||||
*/
|
||||
void ServerLobbyRoomProtocol::connectionRequested(Event* event)
|
||||
{
|
||||
STKPeer* peer = *(event->peer);
|
||||
if (event->data.size() != 5 || event->data[0] != 4)
|
||||
{
|
||||
Log::warn("ServerLobbyRoomProtocol", "The server is sending a badly formated message. Size is %d and first byte %d", event->data.size(), event->data[0]);
|
||||
@@ -207,7 +209,7 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
|
||||
NetworkString message;
|
||||
// new player (1) -- size of id -- id -- size of local id -- local id;
|
||||
message.ai8(1).ai8(4).ai32(player_id).ai8(1).ai8(m_next_id);
|
||||
m_listener->sendMessageExcept(this, event->peer, message);
|
||||
m_listener->sendMessageExcept(this, peer, message);
|
||||
// send a message to the one that asked to connect
|
||||
NetworkString message_ack;
|
||||
// 0b10000001 (connection success) ;
|
||||
@@ -219,16 +221,16 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
|
||||
((token_generator.get(RAND_MAX) & 0xff)));
|
||||
// connection success (129) -- size of token -- token
|
||||
message_ack.ai8(0x81).ai8(1).ai8(m_next_id).ai8(4).ai32(token).ai8(4).ai32(player_id);
|
||||
m_listener->sendMessage(this, event->peer, message_ack);
|
||||
m_listener->sendMessage(this, peer, message_ack);
|
||||
|
||||
event->peer->setClientServerToken(token);
|
||||
peer->setClientServerToken(token);
|
||||
|
||||
NetworkPlayerProfile* profile = new NetworkPlayerProfile();
|
||||
profile->race_id = m_next_id;
|
||||
profile->kart_name = "";
|
||||
profile->user_profile = new OnlineUser("Unnamed Player");
|
||||
m_setup->addPlayer(profile);
|
||||
event->peer->setPlayerProfile(profile);
|
||||
peer->setPlayerProfile(profile);
|
||||
} // accept player
|
||||
else // refuse the connection with code 0 (too much players)
|
||||
{
|
||||
@@ -237,7 +239,7 @@ void ServerLobbyRoomProtocol::connectionRequested(Event* event)
|
||||
message.ai8(1); // 1 bytes for the error code
|
||||
message.ai8(0); // 0 = too much players
|
||||
// send only to the peer that made the request
|
||||
m_listener->sendMessage(this, event->peer, message);
|
||||
m_listener->sendMessage(this, peer, message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,8 +264,9 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
|
||||
event->data.size(), event->data[0]);
|
||||
return;
|
||||
}
|
||||
STKPeer* peer = *(event->peer);
|
||||
uint32_t token = event->data.gui32(1);
|
||||
if (token != event->peer->getClientServerToken())
|
||||
if (token != peer->getClientServerToken())
|
||||
{
|
||||
Log::warn("ServerLobbyRoomProtocol", "Peer sending bad token. Request "
|
||||
"aborted.");
|
||||
@@ -281,7 +284,7 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
|
||||
{
|
||||
NetworkString answer;
|
||||
answer.ai8(0x82).ai8(1).ai8(0); // kart is already taken
|
||||
m_listener->sendMessage(this, event->peer, answer);
|
||||
m_listener->sendMessage(this, peer, answer);
|
||||
return;
|
||||
}
|
||||
// check if this kart is authorized
|
||||
@@ -289,13 +292,13 @@ void ServerLobbyRoomProtocol::kartSelectionRequested(Event* event)
|
||||
{
|
||||
NetworkString answer;
|
||||
answer.ai8(0x82).ai8(1).ai8(1); // kart is not authorized
|
||||
m_listener->sendMessage(this, event->peer, answer);
|
||||
m_listener->sendMessage(this, peer, answer);
|
||||
return;
|
||||
}
|
||||
// send a kart update to everyone
|
||||
NetworkString answer;
|
||||
// kart update (3), 1, race id
|
||||
answer.ai8(0x03).ai8(1).ai8(event->peer->getPlayerProfile()->race_id);
|
||||
answer.ai8(0x03).ai8(1).ai8(peer->getPlayerProfile()->race_id);
|
||||
// kart name size, kart name
|
||||
answer.ai8(kart_name.size()).as(kart_name);
|
||||
m_listener->sendMessage(this, answer);
|
||||
|
||||
Reference in New Issue
Block a user