Allow starting soccer mode in network with goals limit
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <cstdint>
|
||||
#include <quaternion.h>
|
||||
#include <vector3d.h>
|
||||
|
||||
Reference in New Issue
Block a user