Allow starting soccer mode in network with goals limit

This commit is contained in:
Benau
2018-07-13 21:29:26 +08:00
parent 0cee131b9f
commit 23e5dace40
6 changed files with 105 additions and 12 deletions

View File

@@ -25,12 +25,14 @@
#include "graphics/central_settings.hpp"
#include "graphics/irr_driver.hpp"
#include "graphics/render_info.hpp"
#include "karts/kart.hpp"
#include "karts/kart_model.hpp"
#include "karts/kart_properties.hpp"
#include "karts/kart_rewinder.hpp"
#include "karts/rescue_animation.hpp"
#include "karts/controller/local_player_controller.hpp"
#include "karts/controller/network_player_controller.hpp"
#include "network/network_config.hpp"
#include "network/rewind_manager.hpp"
#include "physics/physics.hpp"
#include "states_screens/race_gui_base.hpp"
#include "tracks/track.hpp"
@@ -182,7 +184,8 @@ const std::string& SoccerWorld::getIdent() const
void SoccerWorld::update(int ticks)
{
updateBallPosition(ticks);
if (Track::getCurrentTrack()->hasNavMesh())
if (Track::getCurrentTrack()->hasNavMesh() &&
!NetworkConfig::get()->isNetworking())
{
updateSectorForKarts();
updateAIData();
@@ -388,6 +391,11 @@ AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
team = SOCCER_TEAM_BLUE;
m_kart_team_map[index] = team;
}
else if (NetworkConfig::get()->isNetworking())
{
m_kart_team_map[index] = race_manager->getKartInfo(index).getSoccerTeam();
team = race_manager->getKartInfo(index).getSoccerTeam();
}
else
{
int rm_id = index -
@@ -398,6 +406,13 @@ AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
m_kart_team_map[index] = team;
}
core::stringw online_name;
if (global_player_id > -1)
{
online_name = race_manager->getKartInfo(global_player_id)
.getPlayerName();
}
// Notice: In blender, please set 1,3,5,7... for blue starting position;
// 2,4,6,8... for red.
if (team == SOCCER_TEAM_BLUE)
@@ -412,9 +427,21 @@ AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
btTransform init_pos = getStartTransform(pos_index - 1);
m_kart_position_map[index] = (unsigned)(pos_index - 1);
AbstractKart *new_kart = new Kart(kart_ident, index, position, init_pos,
difficulty, team == SOCCER_TEAM_BLUE ?
std::make_shared<RenderInfo>(0.66f) : std::make_shared<RenderInfo>(1.0f));
std::shared_ptr<RenderInfo> ri = std::make_shared<RenderInfo>();
ri = (team == SOCCER_TEAM_BLUE ? std::make_shared<RenderInfo>(0.66f) :
std::make_shared<RenderInfo>(1.0f));
AbstractKart* new_kart;
if (RewindManager::get()->isEnabled())
{
new_kart = new KartRewinder(kart_ident, index, position, init_pos,
difficulty, ri);
}
else
{
new_kart = new Kart(kart_ident, index, position, init_pos, difficulty,
ri);
}
new_kart->init(race_manager->getKartType(index));
Controller *controller = NULL;
@@ -427,6 +454,8 @@ AbstractKart *SoccerWorld::createKart(const std::string &kart_ident, int index,
break;
case RaceManager::KT_NETWORK_PLAYER:
controller = new NetworkPlayerController(new_kart);
if (!online_name.empty())
new_kart->setOnScreenText(online_name.c_str());
m_num_players++;
break;
case RaceManager::KT_AI:

View File

@@ -82,13 +82,19 @@ void GameSetup::loadWorld()
if (PlayerManager::getCurrentPlayer())
PlayerManager::getCurrentPlayer()->setCurrentChallenge("");
race_manager->setTimeTarget(0.0f);
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER)
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES)
{
race_manager->setReverseTrack(false);
if (isSoccerGoalTarget())
race_manager->setMaxGoal(m_laps);
else
race_manager->setTimeTarget((float)m_laps * 60.0f);
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER)
{
if (isSoccerGoalTarget())
race_manager->setMaxGoal(m_laps);
else
race_manager->setTimeTarget((float)m_laps * 60.0f);
}
race_manager->startSingleRace(m_tracks.back(), -1,
false/*from_overworld*/);
}
else
{

View File

@@ -124,6 +124,8 @@ void LobbyProtocol::configRemoteKart(
rki.setDefaultKartColor(profile->getDefaultKartColor());
rki.setPerPlayerDifficulty(profile->getPerPlayerDifficulty());
rki.setOnlineId(profile->getOnlineId());
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER)
rki.setSoccerTeam((SoccerTeam)(i % 2));
// Inform the race manager about the data for this kart.
race_manager->setPlayerKart(i, rki);
} // for i in players

View File

@@ -38,6 +38,7 @@
#include "race/race_manager.hpp"
#include "states_screens/networking_lobby.hpp"
#include "states_screens/race_result_gui.hpp"
#include "tracks/track.hpp"
#include "tracks/track_manager.hpp"
#include "utils/log.hpp"
#include "utils/random_generator.hpp"
@@ -716,6 +717,59 @@ void ServerLobby::startSelection(const Event *event)
m_available_kts.second.erase(track_erase);
}
switch (NetworkConfig::get()->getLocalGameMode().first)
{
case RaceManager::MINOR_MODE_NORMAL_RACE:
case RaceManager::MINOR_MODE_TIME_TRIAL:
case RaceManager::MINOR_MODE_FOLLOW_LEADER:
{
auto it = m_available_kts.second.begin();
while (it != m_available_kts.second.end())
{
Track* t = track_manager->getTrack(*it);
if (t->isArena() || t->isSoccer() || t->isInternal())
{
it = m_available_kts.second.erase(it);
}
else
it++;
}
break;
}
case RaceManager::MINOR_MODE_3_STRIKES:
{
auto it = m_available_kts.second.begin();
while (it != m_available_kts.second.end())
{
Track* t = track_manager->getTrack(*it);
if (!t->isArena() || t->isInternal())
{
it = m_available_kts.second.erase(it);
}
else
it++;
}
break;
}
case RaceManager::MINOR_MODE_SOCCER:
{
auto it = m_available_kts.second.begin();
while (it != m_available_kts.second.end())
{
Track* t = track_manager->getTrack(*it);
if (!t->isSoccer() || t->isInternal())
{
it = m_available_kts.second.erase(it);
}
else
it++;
}
break;
}
default:
assert(false);
break;
}
const auto& all_k = m_available_kts.first;
const auto& all_t = m_available_kts.second;
ns->addUInt16((uint16_t)all_k.size()).addUInt16((uint16_t)all_t.size());

View File

@@ -302,8 +302,9 @@ void TracksScreen::buildTrackList()
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_EASTER_EGG
&& !curr->hasEasterEggs())
continue;
if (curr->isArena() || curr->isSoccer()||curr->isInternal()) continue;
if (!curr->isInGroup(DEFAULT_GROUP_NAME)) continue;
if (!is_network &&
(curr->isArena() || curr->isSoccer() || curr->isInternal()))
continue;
if (curr_group_name != ALL_TRACK_GROUPS_ID &&
!curr->isInGroup(curr_group_name)) continue;
if (is_network &&

View File

@@ -24,6 +24,7 @@
#include <algorithm>
#include <array>
#include <cassert>
#include <cmath>
#include <cstdint>
#include <quaternion.h>
#include <vector3d.h>