From cf3f64fed99d27be89b8719925c12a978e6c1f72 Mon Sep 17 00:00:00 2001 From: xethm55 Date: Sat, 6 Oct 2012 10:57:05 -0400 Subject: [PATCH] Only allow player to shoot if player does not have any projectiles pending --- src/client/Client.cc | 25 ++++++++++++++++++-- src/common/Player.cc | 1 + src/common/Player.h | 2 +- src/server/Server.cc | 54 +++++++++++++++++++++++++++----------------- 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 50d2dd1..c3bac71 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -125,11 +125,20 @@ void Client::run(bool fullscreen, int width, int height, std::string pname) case sf::Event::MouseButtonPressed: if((event.mouseButton.button == sf::Mouse::Left) && (m_shot_fired == false) && // Don't allow shots ontop of each other + // The server needs to allow player to shoot, so that + // multiple shots cannot be fired at the same time + (m_players[m_current_player]->m_shot_allowed) && (m_client_has_focus)) + { m_left_button_pressed = true; + } break; case sf::Event::MouseButtonReleased: if((event.mouseButton.button == sf::Mouse::Left) && + // Prevents a shot from being fired upon release + // while another shot is currently being fired. + (m_players[m_current_player]->m_shot_allowed) && + (m_left_button_pressed) && (m_client_has_focus)) { m_drawing_shot = false; @@ -253,12 +262,24 @@ void Client::update(double elapsed_time) { float x; float y; + sf::Uint8 pindex; client_packet >> x; client_packet >> y; + client_packet >> pindex; + // Damage the tile if it exists if((!m_map.get_tile_at(x, y).isNull())) { m_map.get_tile_at(x, y)->shot(); } + // Allow player to shoot again + if(m_players.end() != m_players.find(pindex)) + { + m_players[pindex]->m_shot_allowed = true; + if(pindex == m_current_player) + { + m_shot_fired = false; + } + } break; } @@ -360,9 +381,9 @@ void Client::update(double elapsed_time) client_packet << packet_type; client_packet << m_current_player; client_packet << (float)(m_drawing_shot_distance + SHOT_RING_WIDTH / 2.0); - m_net_client->sendData(client_packet, true); - m_shot_fired = false; + m_net_client->sendData(client_packet, true); m_drawing_shot_distance = 0; + m_players[m_current_player]->m_shot_allowed = false; } } else if(!registered_player) diff --git a/src/common/Player.cc b/src/common/Player.cc index 07dded6..b05c182 100644 --- a/src/common/Player.cc +++ b/src/common/Player.cc @@ -20,5 +20,6 @@ Player::Player() m_shot_start_x = 0.0; m_shot_start_y = 0.0; m_shot_direction = 0.0; + m_shot_allowed = true; } diff --git a/src/common/Player.h b/src/common/Player.h index 12c072e..315cb27 100644 --- a/src/common/Player.h +++ b/src/common/Player.h @@ -26,7 +26,7 @@ class Player double m_shot_start_y; double m_shot_direction; double m_shot_start_time; - + bool m_shot_allowed; Player(); }; diff --git a/src/server/Server.cc b/src/server/Server.cc index 0cb0ba7..aab814e 100644 --- a/src/server/Server.cc +++ b/src/server/Server.cc @@ -156,14 +156,20 @@ void Server::update( double elapsed_time ) float shot_distance; server_packet >> pindex; server_packet >> shot_distance; - m_players[pindex]->m_shot_distance = shot_distance; - m_players[pindex]->m_shot_start_time = Timer::GetTimeDouble(); - - // Need to store off the current player location so that the - // correct tile can be calculated later. - m_players[pindex]->m_shot_start_x = m_players[pindex]->x; - m_players[pindex]->m_shot_start_y = m_players[pindex]->y; - m_players[pindex]->m_shot_direction = m_players[pindex]->direction; + // start the shot process if a player is allowed to shoot and exits + if((m_players.end() != m_players.find(pindex)) && + (m_players[pindex]->m_shot_allowed)) + { + m_players[pindex]->m_shot_distance = shot_distance; + m_players[pindex]->m_shot_start_time = Timer::GetTimeDouble(); + m_players[pindex]->m_shot_allowed = false; + + // Need to store off the current player location so that the + // correct tile can be calculated later. + m_players[pindex]->m_shot_start_x = m_players[pindex]->x; + m_players[pindex]->m_shot_start_y = m_players[pindex]->y; + m_players[pindex]->m_shot_direction = m_players[pindex]->direction; + } break; } @@ -209,21 +215,27 @@ void Server::update( double elapsed_time ) float tile_x = m_players[pindex]->m_shot_start_x + (player_dir_x * m_players[pindex]->m_shot_distance); float tile_y = m_players[pindex]->m_shot_start_y + (player_dir_y * m_players[pindex]->m_shot_distance); refptr p_tile = m_map.get_tile_at(tile_x, tile_y); - if((!p_tile.isNull()) && - (p_tile->get_damage_state() < HexTile::DESTROYED)) - { - // Send a message to all clients letting them know a tile was damaged - sf::Uint8 ptype = TILE_DAMAGED; - - server_packet.clear(); - server_packet << ptype; - server_packet << p_tile->get_x(); - server_packet << p_tile->get_y(); - m_net_server->sendData(server_packet, true); - m_map.get_tile_at(tile_x, tile_y)->shot(); - } + // Send a message to all clients letting them know a tile was damaged + // always send message since it will reenable the player shot ability. + sf::Uint8 ptype = TILE_DAMAGED; + server_packet.clear(); + server_packet << ptype; + server_packet << tile_x; + server_packet << tile_y; + server_packet << pindex; // Needed to alert the client that the player can now shoot again. + m_net_server->sendData(server_packet, true); + + // Reset the shot logic + m_players[pindex]->m_shot_allowed = true; m_players[pindex]->m_shot_distance = 0.0; m_players[pindex]->m_shot_start_time = 0.0; + + // If tile exists, damage the tile. + if((!p_tile.isNull()) && + (p_tile->get_damage_state() < HexTile::DESTROYED)) + { + p_tile->shot(); + } } }