Allow using real addon karts in networking
This commit is contained in:
parent
39e3c189da
commit
ebd380c0bc
@ -580,5 +580,6 @@
|
|||||||
<capabilities name="report_player"/>
|
<capabilities name="report_player"/>
|
||||||
<capabilities name="soccer_fixes"/>
|
<capabilities name="soccer_fixes"/>
|
||||||
<capabilities name="ranking_changes"/>
|
<capabilities name="ranking_changes"/>
|
||||||
|
<capabilities name="real_addon_karts"/>
|
||||||
</network-capabilities>
|
</network-capabilities>
|
||||||
</config>
|
</config>
|
||||||
|
@ -46,7 +46,8 @@ AbstractKart::AbstractKart(const std::string& ident,
|
|||||||
: Moveable()
|
: Moveable()
|
||||||
{
|
{
|
||||||
m_world_kart_id = world_kart_id;
|
m_world_kart_id = world_kart_id;
|
||||||
loadKartProperties(ident, handicap, ri);
|
const RemoteKartInfo& rki = RaceManager::get()->getKartInfo(m_world_kart_id);
|
||||||
|
loadKartProperties(ident, handicap, ri, rki.getKartData());
|
||||||
} // AbstractKart
|
} // AbstractKart
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -78,12 +79,14 @@ void AbstractKart::reset()
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void AbstractKart::loadKartProperties(const std::string& new_ident,
|
void AbstractKart::loadKartProperties(const std::string& new_ident,
|
||||||
HandicapLevel handicap,
|
HandicapLevel handicap,
|
||||||
std::shared_ptr<GE::GERenderInfo> ri)
|
std::shared_ptr<GE::GERenderInfo> ri,
|
||||||
|
const KartData& kart_data)
|
||||||
{
|
{
|
||||||
m_kart_properties.reset(new KartProperties());
|
m_kart_properties.reset(new KartProperties());
|
||||||
|
KartProperties* tmp_kp = NULL;
|
||||||
const KartProperties* kp = kart_properties_manager->getKart(new_ident);
|
const KartProperties* kp = kart_properties_manager->getKart(new_ident);
|
||||||
const KartProperties* kp_addon = NULL;
|
const KartProperties* kp_addon = NULL;
|
||||||
const KartProperties* official_kp = NULL;
|
bool new_hitbox = false;
|
||||||
Vec3 gravity_shift;
|
Vec3 gravity_shift;
|
||||||
if (NetworkConfig::get()->isNetworking() &&
|
if (NetworkConfig::get()->isNetworking() &&
|
||||||
NetworkConfig::get()->useTuxHitboxAddon() && kp && kp->isAddon())
|
NetworkConfig::get()->useTuxHitboxAddon() && kp && kp->isAddon())
|
||||||
@ -106,16 +109,38 @@ void AbstractKart::loadKartProperties(const std::string& new_ident,
|
|||||||
kp = kart_properties_manager->getKart(std::string("tux"));
|
kp = kart_properties_manager->getKart(std::string("tux"));
|
||||||
if (NetworkConfig::get()->isNetworking() && official_kart)
|
if (NetworkConfig::get()->isNetworking() && official_kart)
|
||||||
{
|
{
|
||||||
official_kp = OfficialKarts::getKartByIdent(new_ident,
|
const KartProperties* official_kp = OfficialKarts::getKartByIdent(
|
||||||
&m_kart_width, &m_kart_height, &m_kart_length, &gravity_shift);
|
new_ident, &m_kart_width, &m_kart_height, &m_kart_length,
|
||||||
|
&gravity_shift);
|
||||||
if (official_kp)
|
if (official_kp)
|
||||||
|
{
|
||||||
kp = official_kp;
|
kp = official_kp;
|
||||||
|
new_hitbox = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NetworkConfig::get()->isNetworking() &&
|
||||||
|
!kart_data.m_kart_type.empty() &&
|
||||||
|
kart_properties_manager->hasKartTypeCharacteristic(
|
||||||
|
kart_data.m_kart_type))
|
||||||
|
{
|
||||||
|
tmp_kp = new KartProperties();
|
||||||
|
tmp_kp->copyFrom(kp);
|
||||||
|
tmp_kp->initKartWithDifferentType(kart_data.m_kart_type);
|
||||||
|
kp = tmp_kp;
|
||||||
|
m_kart_width = kart_data.m_width;
|
||||||
|
m_kart_height = kart_data.m_height;
|
||||||
|
m_kart_length = kart_data.m_length;
|
||||||
|
gravity_shift = kart_data.m_gravity_shift;
|
||||||
|
new_hitbox = true;
|
||||||
|
}
|
||||||
|
|
||||||
m_kart_properties->copyForPlayer(kp, handicap);
|
m_kart_properties->copyForPlayer(kp, handicap);
|
||||||
if (kp_addon)
|
if (kp_addon)
|
||||||
m_kart_properties->adjustForOnlineAddonKart(kp_addon);
|
m_kart_properties->adjustForOnlineAddonKart(kp_addon);
|
||||||
if (official_kp)
|
|
||||||
|
if (new_hitbox)
|
||||||
{
|
{
|
||||||
m_kart_properties->updateForOnlineKart(new_ident, gravity_shift,
|
m_kart_properties->updateForOnlineKart(new_ident, gravity_shift,
|
||||||
m_kart_length);
|
m_kart_length);
|
||||||
@ -136,7 +161,7 @@ void AbstractKart::loadKartProperties(const std::string& new_ident,
|
|||||||
m_kart_model.reset(kp_addon->getKartModelCopy(ri));
|
m_kart_model.reset(kp_addon->getKartModelCopy(ri));
|
||||||
else
|
else
|
||||||
m_kart_model.reset(m_kart_properties->getKartModelCopy(ri));
|
m_kart_model.reset(m_kart_properties->getKartModelCopy(ri));
|
||||||
if (official_kp == NULL)
|
if (!new_hitbox)
|
||||||
{
|
{
|
||||||
m_kart_width = kp->getMasterKartModel().getWidth();
|
m_kart_width = kp->getMasterKartModel().getWidth();
|
||||||
m_kart_height = kp->getMasterKartModel().getHeight();
|
m_kart_height = kp->getMasterKartModel().getHeight();
|
||||||
@ -144,18 +169,20 @@ void AbstractKart::loadKartProperties(const std::string& new_ident,
|
|||||||
}
|
}
|
||||||
m_kart_highest_point = m_kart_model->getHighestPoint();
|
m_kart_highest_point = m_kart_model->getHighestPoint();
|
||||||
m_wheel_graphics_position = m_kart_model->getWheelsGraphicsPosition();
|
m_wheel_graphics_position = m_kart_model->getWheelsGraphicsPosition();
|
||||||
|
delete tmp_kp;
|
||||||
} // loadKartProperties
|
} // loadKartProperties
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void AbstractKart::changeKart(const std::string& new_ident,
|
void AbstractKart::changeKart(const std::string& new_ident,
|
||||||
HandicapLevel handicap,
|
HandicapLevel handicap,
|
||||||
std::shared_ptr<GE::GERenderInfo> ri)
|
std::shared_ptr<GE::GERenderInfo> ri,
|
||||||
|
const KartData& kart_data)
|
||||||
{
|
{
|
||||||
// Reset previous kart (including delete old animation above)
|
// Reset previous kart (including delete old animation above)
|
||||||
reset();
|
reset();
|
||||||
// Remove kart body
|
// Remove kart body
|
||||||
Physics::get()->removeKart(this);
|
Physics::get()->removeKart(this);
|
||||||
loadKartProperties(new_ident, handicap, ri);
|
loadKartProperties(new_ident, handicap, ri, kart_data);
|
||||||
} // changeKart
|
} // changeKart
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -81,7 +81,8 @@ private:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void loadKartProperties(const std::string& new_ident,
|
void loadKartProperties(const std::string& new_ident,
|
||||||
HandicapLevel handicap,
|
HandicapLevel handicap,
|
||||||
std::shared_ptr<GE::GERenderInfo> ri);
|
std::shared_ptr<GE::GERenderInfo> ri,
|
||||||
|
const KartData& kart_data);
|
||||||
protected:
|
protected:
|
||||||
btTransform m_starting_transform;
|
btTransform m_starting_transform;
|
||||||
|
|
||||||
@ -144,7 +145,8 @@ public:
|
|||||||
/** Change to new kart instancely (used in network live join). */
|
/** Change to new kart instancely (used in network live join). */
|
||||||
virtual void changeKart(const std::string& new_ident,
|
virtual void changeKart(const std::string& new_ident,
|
||||||
HandicapLevel handicap,
|
HandicapLevel handicap,
|
||||||
std::shared_ptr<GE::GERenderInfo> ri);
|
std::shared_ptr<GE::GERenderInfo> ri,
|
||||||
|
const KartData& kart_data = KartData());
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
// Access to the handicap.
|
// Access to the handicap.
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
@ -223,9 +223,10 @@ void Kart::initSound()
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void Kart::changeKart(const std::string& new_ident,
|
void Kart::changeKart(const std::string& new_ident,
|
||||||
HandicapLevel handicap,
|
HandicapLevel handicap,
|
||||||
std::shared_ptr<GE::GERenderInfo> ri)
|
std::shared_ptr<GE::GERenderInfo> ri,
|
||||||
|
const KartData& kart_data)
|
||||||
{
|
{
|
||||||
AbstractKart::changeKart(new_ident, handicap, ri);
|
AbstractKart::changeKart(new_ident, handicap, ri, kart_data);
|
||||||
m_kart_model->setKart(this);
|
m_kart_model->setKart(this);
|
||||||
|
|
||||||
scene::ISceneNode* old_node = m_node;
|
scene::ISceneNode* old_node = m_node;
|
||||||
|
@ -338,7 +338,8 @@ public:
|
|||||||
virtual void setXYZ(const Vec3& a) OVERRIDE;
|
virtual void setXYZ(const Vec3& a) OVERRIDE;
|
||||||
virtual void changeKart(const std::string& new_ident,
|
virtual void changeKart(const std::string& new_ident,
|
||||||
HandicapLevel handicap,
|
HandicapLevel handicap,
|
||||||
std::shared_ptr<GE::GERenderInfo> ri) OVERRIDE;
|
std::shared_ptr<GE::GERenderInfo> ri,
|
||||||
|
const KartData& kart_data = KartData()) OVERRIDE;
|
||||||
|
|
||||||
// ========================================================================================
|
// ========================================================================================
|
||||||
// SPEED and speed-boost related functions
|
// SPEED and speed-boost related functions
|
||||||
|
@ -416,6 +416,7 @@ void KartProperties::adjustForOnlineAddonKart(const KartProperties* source)
|
|||||||
m_icon_material = source->m_icon_material;
|
m_icon_material = source->m_icon_material;
|
||||||
m_minimap_icon = source->m_minimap_icon;
|
m_minimap_icon = source->m_minimap_icon;
|
||||||
m_engine_sfx_type = source->m_engine_sfx_type;
|
m_engine_sfx_type = source->m_engine_sfx_type;
|
||||||
|
m_skid_sound = source->m_skid_sound;
|
||||||
m_color = source->m_color;
|
m_color = source->m_color;
|
||||||
} // adjustForOnlineAddonKart
|
} // adjustForOnlineAddonKart
|
||||||
|
|
||||||
@ -430,6 +431,14 @@ void KartProperties::combineCharacteristics(HandicapLevel handicap)
|
|||||||
RaceManager::get()->getDifficulty())));
|
RaceManager::get()->getDifficulty())));
|
||||||
|
|
||||||
// Try to get the kart type
|
// Try to get the kart type
|
||||||
|
if (!kart_properties_manager->hasKartTypeCharacteristic(m_kart_type))
|
||||||
|
{
|
||||||
|
Log::warn("KartProperties",
|
||||||
|
"Can't find kart type '%s' for kart '%s', defaulting to '%s'.",
|
||||||
|
m_kart_type.c_str(), m_name.c_str(),
|
||||||
|
kart_properties_manager->getDefaultKartType().c_str());
|
||||||
|
m_kart_type = kart_properties_manager->getDefaultKartType();
|
||||||
|
}
|
||||||
const AbstractCharacteristic *characteristic = kart_properties_manager->
|
const AbstractCharacteristic *characteristic = kart_properties_manager->
|
||||||
getKartTypeCharacteristic(m_kart_type, m_name);
|
getKartTypeCharacteristic(m_kart_type, m_name);
|
||||||
|
|
||||||
|
@ -233,6 +233,12 @@ public:
|
|||||||
bool isInGroup (const std::string &group) const;
|
bool isInGroup (const std::string &group) const;
|
||||||
bool operator<(const KartProperties &other) const;
|
bool operator<(const KartProperties &other) const;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void initKartWithDifferentType(const std::string& type)
|
||||||
|
{
|
||||||
|
m_kart_type = type;
|
||||||
|
combineCharacteristics(HANDICAP_NONE);
|
||||||
|
}
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Returns the characteristics for this kart. */
|
/** Returns the characteristics for this kart. */
|
||||||
const AbstractCharacteristic* getCharacteristic() const;
|
const AbstractCharacteristic* getCharacteristic() const;
|
||||||
|
@ -329,9 +329,9 @@ const AbstractCharacteristic* KartPropertiesManager::getKartTypeCharacteristic(c
|
|||||||
|
|
||||||
if (!type_is_valid)
|
if (!type_is_valid)
|
||||||
Log::warn("KartProperties", "Can't find kart type '%s' for kart '%s', defaulting to '%s'.",
|
Log::warn("KartProperties", "Can't find kart type '%s' for kart '%s', defaulting to '%s'.",
|
||||||
type.c_str(), name.c_str(), m_kart_types[0].c_str());
|
type.c_str(), name.c_str(), getDefaultKartType().c_str());
|
||||||
|
|
||||||
std::string valid_type = (type_is_valid) ? type : m_kart_types[0];
|
const std::string& valid_type = (type_is_valid) ? type : getDefaultKartType();
|
||||||
|
|
||||||
std::map<std::string, std::unique_ptr<AbstractCharacteristic> >::const_iterator
|
std::map<std::string, std::unique_ptr<AbstractCharacteristic> >::const_iterator
|
||||||
it = m_kart_type_characteristics.find(valid_type);
|
it = m_kart_type_characteristics.find(valid_type);
|
||||||
|
@ -112,6 +112,14 @@ public:
|
|||||||
/** Get a characteristic that holds the values for a kart type. */
|
/** Get a characteristic that holds the values for a kart type. */
|
||||||
const AbstractCharacteristic* getKartTypeCharacteristic(const std::string &type, const std::string &name) const;
|
const AbstractCharacteristic* getKartTypeCharacteristic(const std::string &type, const std::string &name) const;
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
const std::string& getDefaultKartType() const { return m_kart_types[0]; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
bool hasKartTypeCharacteristic(const std::string& type) const
|
||||||
|
{
|
||||||
|
return m_kart_type_characteristics.find(type) !=
|
||||||
|
m_kart_type_characteristics.end();
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
/** Get a characteristic that holds the values for a player difficulty. */
|
/** Get a characteristic that holds the values for a player difficulty. */
|
||||||
const AbstractCharacteristic* getPlayerCharacteristic(const std::string &type) const;
|
const AbstractCharacteristic* getPlayerCharacteristic(const std::string &type) const;
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
54
src/network/kart_data.cpp
Normal file
54
src/network/kart_data.cpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#include "network/kart_data.hpp"
|
||||||
|
|
||||||
|
#include "karts/kart_model.hpp"
|
||||||
|
#include "karts/kart_properties.hpp"
|
||||||
|
#include "network/network_string.hpp"
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
KartData::KartData(const KartProperties* kp)
|
||||||
|
{
|
||||||
|
m_kart_type = kp->getKartType();
|
||||||
|
if (!m_kart_type.empty())
|
||||||
|
{
|
||||||
|
m_width = kp->getMasterKartModel().getWidth();
|
||||||
|
m_height = kp->getMasterKartModel().getHeight();
|
||||||
|
m_length = kp->getMasterKartModel().getLength();
|
||||||
|
m_gravity_shift = kp->getGravityCenterShift();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_width = 0.0f;
|
||||||
|
m_height = 0.0f;
|
||||||
|
m_length = 0.0f;
|
||||||
|
}
|
||||||
|
} // KartData(KartProperties*)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
KartData::KartData(const BareNetworkString& ns)
|
||||||
|
{
|
||||||
|
ns.decodeString(&m_kart_type);
|
||||||
|
if (!m_kart_type.empty())
|
||||||
|
{
|
||||||
|
m_width = ns.getFloat();
|
||||||
|
m_height = ns.getFloat();
|
||||||
|
m_length = ns.getFloat();
|
||||||
|
m_gravity_shift = ns.getVec3();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_width = 0.0f;
|
||||||
|
m_height = 0.0f;
|
||||||
|
m_length = 0.0f;
|
||||||
|
}
|
||||||
|
} // KartData(BareNetworkString&)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void KartData::encode(BareNetworkString* ns) const
|
||||||
|
{
|
||||||
|
ns->encodeString(m_kart_type);
|
||||||
|
if (!m_kart_type.empty())
|
||||||
|
{
|
||||||
|
ns->addFloat(m_width).addFloat(m_height).addFloat(m_length)
|
||||||
|
.add(m_gravity_shift);
|
||||||
|
}
|
||||||
|
} // encode(BareNetworkString*)
|
34
src/network/kart_data.hpp
Normal file
34
src/network/kart_data.hpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#ifndef KART_DATA_HPP
|
||||||
|
#define KART_DATA_HPP
|
||||||
|
|
||||||
|
#include "utils/vec3.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class BareNetworkString;
|
||||||
|
class KartProperties;
|
||||||
|
|
||||||
|
class KartData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::string m_kart_type;
|
||||||
|
float m_width;
|
||||||
|
float m_height;
|
||||||
|
float m_length;
|
||||||
|
Vec3 m_gravity_shift;
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
KartData()
|
||||||
|
{
|
||||||
|
m_width = 0.0f;
|
||||||
|
m_height = 0.0f;
|
||||||
|
m_length = 0.0f;
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
KartData(const KartProperties* kp);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
KartData(const BareNetworkString& ns);
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void encode(BareNetworkString* ns) const;
|
||||||
|
}; // class KartData
|
||||||
|
|
||||||
|
#endif // KART_DATA_HPP
|
@ -22,6 +22,7 @@
|
|||||||
#ifndef HEADER_NETWORK_PLAYER_PROFILE
|
#ifndef HEADER_NETWORK_PLAYER_PROFILE
|
||||||
#define HEADER_NETWORK_PLAYER_PROFILE
|
#define HEADER_NETWORK_PLAYER_PROFILE
|
||||||
|
|
||||||
|
#include "network/kart_data.hpp"
|
||||||
#include "utils/types.hpp"
|
#include "utils/types.hpp"
|
||||||
|
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
@ -72,6 +73,7 @@ private:
|
|||||||
/** 2-letter country code of player. */
|
/** 2-letter country code of player. */
|
||||||
std::string m_country_code;
|
std::string m_country_code;
|
||||||
|
|
||||||
|
KartData m_kart_data;
|
||||||
public:
|
public:
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
static std::shared_ptr<NetworkPlayerProfile>
|
static std::shared_ptr<NetworkPlayerProfile>
|
||||||
@ -121,7 +123,11 @@ public:
|
|||||||
uint32_t getHostId() const { return m_host_id; }
|
uint32_t getHostId() const { return m_host_id; }
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Sets the kart name for this player. */
|
/** Sets the kart name for this player. */
|
||||||
void setKartName(const std::string &kart_name) { m_kart_name = kart_name; }
|
void setKartName(const std::string &kart_name)
|
||||||
|
{
|
||||||
|
m_kart_name = kart_name;
|
||||||
|
m_kart_data = KartData();
|
||||||
|
}
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
/** Returns the name of the kart this player has selected. */
|
/** Returns the name of the kart this player has selected. */
|
||||||
const std::string &getKartName() const { return m_kart_name; }
|
const std::string &getKartName() const { return m_kart_name; }
|
||||||
@ -164,6 +170,10 @@ public:
|
|||||||
KartTeam getTeam() const { return m_team.load(); }
|
KartTeam getTeam() const { return m_team.load(); }
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
const std::string& getCountryCode() const { return m_country_code; }
|
const std::string& getCountryCode() const { return m_country_code; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
void setKartData(const KartData& data) { m_kart_data = data; }
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
const KartData& getKartData() const { return m_kart_data; }
|
||||||
}; // class NetworkPlayerProfile
|
}; // class NetworkPlayerProfile
|
||||||
|
|
||||||
#endif // HEADER_NETWORK_PLAYER_PROFILE
|
#endif // HEADER_NETWORK_PLAYER_PROFILE
|
||||||
|
@ -252,6 +252,22 @@ bool ClientLobby::notifyEventAsynchronous(Event* event)
|
|||||||
return true;
|
return true;
|
||||||
} // notifyEventAsynchronous
|
} // notifyEventAsynchronous
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
void ClientLobby::getPlayersAddonKartType(const BareNetworkString& data,
|
||||||
|
std::vector<std::shared_ptr<NetworkPlayerProfile> >& players) const
|
||||||
|
{
|
||||||
|
if (NetworkConfig::get()->getServerCapabilities().find(
|
||||||
|
"real_addon_karts") ==
|
||||||
|
NetworkConfig::get()->getServerCapabilities().end() ||
|
||||||
|
data.size() == 0)
|
||||||
|
return;
|
||||||
|
for (unsigned i = 0; i < players.size(); i++)
|
||||||
|
{
|
||||||
|
KartData kart_data(data);
|
||||||
|
players[i]->setKartData(kart_data);
|
||||||
|
}
|
||||||
|
} // getPlayersAddonKartType
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void ClientLobby::addAllPlayers(Event* event)
|
void ClientLobby::addAllPlayers(Event* event)
|
||||||
{
|
{
|
||||||
@ -316,6 +332,7 @@ void ClientLobby::addAllPlayers(Event* event)
|
|||||||
unsigned flag_deactivated_time = data.getUInt16();
|
unsigned flag_deactivated_time = data.getUInt16();
|
||||||
RaceManager::get()->setFlagDeactivatedTicks(flag_deactivated_time);
|
RaceManager::get()->setFlagDeactivatedTicks(flag_deactivated_time);
|
||||||
}
|
}
|
||||||
|
getPlayersAddonKartType(data, players);
|
||||||
configRemoteKart(players, isSpectator() ? 1 :
|
configRemoteKart(players, isSpectator() ? 1 :
|
||||||
(int)NetworkConfig::get()->getNetworkPlayers().size());
|
(int)NetworkConfig::get()->getNetworkPlayers().size());
|
||||||
loadWorld();
|
loadWorld();
|
||||||
@ -1307,6 +1324,7 @@ void ClientLobby::liveJoinAcknowledged(Event* event)
|
|||||||
// player connection or disconnection
|
// player connection or disconnection
|
||||||
std::vector<std::shared_ptr<NetworkPlayerProfile> > players =
|
std::vector<std::shared_ptr<NetworkPlayerProfile> > players =
|
||||||
decodePlayers(data);
|
decodePlayers(data);
|
||||||
|
getPlayersAddonKartType(data, players);
|
||||||
w->resetElimination();
|
w->resetElimination();
|
||||||
for (unsigned i = 0; i < players.size(); i++)
|
for (unsigned i = 0; i < players.size(); i++)
|
||||||
{
|
{
|
||||||
@ -1389,6 +1407,12 @@ void ClientLobby::handleKartInfo(Event* event)
|
|||||||
data.decodeString(&kart_name);
|
data.decodeString(&kart_name);
|
||||||
std::string country_code;
|
std::string country_code;
|
||||||
data.decodeString(&country_code);
|
data.decodeString(&country_code);
|
||||||
|
KartData kart_data;
|
||||||
|
if (NetworkConfig::get()->getServerCapabilities().find(
|
||||||
|
"real_addon_karts") !=
|
||||||
|
NetworkConfig::get()->getServerCapabilities().end() &&
|
||||||
|
data.size() > 0)
|
||||||
|
kart_data = KartData(data);
|
||||||
|
|
||||||
RemoteKartInfo& rki = RaceManager::get()->getKartInfo(kart_id);
|
RemoteKartInfo& rki = RaceManager::get()->getKartInfo(kart_id);
|
||||||
rki.setPlayerName(player_name);
|
rki.setPlayerName(player_name);
|
||||||
@ -1399,6 +1423,7 @@ void ClientLobby::handleKartInfo(Event* event)
|
|||||||
rki.setLocalPlayerId(local_id);
|
rki.setLocalPlayerId(local_id);
|
||||||
rki.setKartName(kart_name);
|
rki.setKartName(kart_name);
|
||||||
rki.setCountryCode(country_code);
|
rki.setCountryCode(country_code);
|
||||||
|
rki.setKartData(kart_data);
|
||||||
addLiveJoiningKart(kart_id, rki, live_join_util_ticks);
|
addLiveJoiningKart(kart_id, rki, live_join_util_ticks);
|
||||||
|
|
||||||
core::stringw msg;
|
core::stringw msg;
|
||||||
|
@ -148,6 +148,8 @@ private:
|
|||||||
decodePlayers(const BareNetworkString& data,
|
decodePlayers(const BareNetworkString& data,
|
||||||
std::shared_ptr<STKPeer> peer = nullptr,
|
std::shared_ptr<STKPeer> peer = nullptr,
|
||||||
bool* is_spectator = NULL) const;
|
bool* is_spectator = NULL) const;
|
||||||
|
void getPlayersAddonKartType(const BareNetworkString& data,
|
||||||
|
std::vector<std::shared_ptr<NetworkPlayerProfile> >& players) const;
|
||||||
void getKartsTracksNetworkString(BareNetworkString* ns);
|
void getKartsTracksNetworkString(BareNetworkString* ns);
|
||||||
void doInstallAddonsPack();
|
void doInstallAddonsPack();
|
||||||
public:
|
public:
|
||||||
|
@ -153,6 +153,7 @@ void LobbyProtocol::configRemoteKart(
|
|||||||
if (RaceManager::get()->teamEnabled())
|
if (RaceManager::get()->teamEnabled())
|
||||||
rki.setKartTeam(profile->getTeam());
|
rki.setKartTeam(profile->getTeam());
|
||||||
rki.setCountryCode(profile->getCountryCode());
|
rki.setCountryCode(profile->getCountryCode());
|
||||||
|
rki.setKartData(profile->getKartData());
|
||||||
rki.setNetworkPlayerProfile(profile);
|
rki.setNetworkPlayerProfile(profile);
|
||||||
// Inform the race manager about the data for this kart.
|
// Inform the race manager about the data for this kart.
|
||||||
RaceManager::get()->setPlayerKart(i, rki);
|
RaceManager::get()->setPlayerKart(i, rki);
|
||||||
@ -236,7 +237,8 @@ void LobbyProtocol::addLiveJoiningKart(int kart_id, const RemoteKartInfo& rki,
|
|||||||
std::make_shared<GE::GERenderInfo>(1.0f) :
|
std::make_shared<GE::GERenderInfo>(1.0f) :
|
||||||
rki.getKartTeam() == KART_TEAM_BLUE ?
|
rki.getKartTeam() == KART_TEAM_BLUE ?
|
||||||
std::make_shared<GE::GERenderInfo>(0.66f) :
|
std::make_shared<GE::GERenderInfo>(0.66f) :
|
||||||
std::make_shared<GE::GERenderInfo>(rki.getDefaultKartColor()));
|
std::make_shared<GE::GERenderInfo>(rki.getDefaultKartColor()),
|
||||||
|
rki.getKartData());
|
||||||
k->setLiveJoinKart(live_join_util_ticks);
|
k->setLiveJoinKart(live_join_util_ticks);
|
||||||
World::getWorld()->initTeamArrows(k);
|
World::getWorld()->initTeamArrows(k);
|
||||||
if (!k->getController()->isLocalPlayerController())
|
if (!k->getController()->isLocalPlayerController())
|
||||||
|
@ -1736,6 +1736,8 @@ NetworkString* ServerLobby::getLoadWorldMessage(
|
|||||||
ServerConfig::m_flag_deactivated_time);
|
ServerConfig::m_flag_deactivated_time);
|
||||||
load_world_message->addUInt16(flag_deactivated_time);
|
load_world_message->addUInt16(flag_deactivated_time);
|
||||||
}
|
}
|
||||||
|
for (unsigned i = 0; i < players.size(); i++)
|
||||||
|
players[i]->getKartData().encode(load_world_message);
|
||||||
return load_world_message;
|
return load_world_message;
|
||||||
} // getLoadWorldMessage
|
} // getLoadWorldMessage
|
||||||
|
|
||||||
@ -2065,6 +2067,8 @@ void ServerLobby::finishedLoadingLiveJoinClient(Event* event)
|
|||||||
std::vector<std::shared_ptr<NetworkPlayerProfile> > players =
|
std::vector<std::shared_ptr<NetworkPlayerProfile> > players =
|
||||||
getLivePlayers();
|
getLivePlayers();
|
||||||
encodePlayers(ns, players);
|
encodePlayers(ns, players);
|
||||||
|
for (unsigned i = 0; i < players.size(); i++)
|
||||||
|
players[i]->getKartData().encode(ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_peers_ready[peer] = false;
|
m_peers_ready[peer] = false;
|
||||||
@ -5337,6 +5341,35 @@ void ServerLobby::setPlayerKarts(const NetworkString& ns, STKPeer* peer) const
|
|||||||
peer->getPlayerProfiles()[i]->setKartName(kart);
|
peer->getPlayerProfiles()[i]->setKartName(kart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (peer->getClientCapabilities().find("real_addon_karts") ==
|
||||||
|
peer->getClientCapabilities().end() || ns.size() == 0)
|
||||||
|
return;
|
||||||
|
for (unsigned i = 0; i < player_count; i++)
|
||||||
|
{
|
||||||
|
KartData kart_data(ns);
|
||||||
|
std::string type = kart_data.m_kart_type;
|
||||||
|
auto& player = peer->getPlayerProfiles()[i];
|
||||||
|
const std::string& kart_id = player->getKartName();
|
||||||
|
if (NetworkConfig::get()->useTuxHitboxAddon() &&
|
||||||
|
StringUtils::startsWith(kart_id, "addon_") &&
|
||||||
|
kart_properties_manager->hasKartTypeCharacteristic(type))
|
||||||
|
{
|
||||||
|
const KartProperties* real_addon =
|
||||||
|
kart_properties_manager->getKart(kart_id);
|
||||||
|
if (ServerConfig::m_real_addon_karts && real_addon)
|
||||||
|
{
|
||||||
|
kart_data = KartData(real_addon);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const KartProperties* tux_kp =
|
||||||
|
kart_properties_manager->getKart("tux");
|
||||||
|
kart_data = KartData(tux_kp);
|
||||||
|
kart_data.m_kart_type = type;
|
||||||
|
}
|
||||||
|
player->setKartData(kart_data);
|
||||||
|
}
|
||||||
|
}
|
||||||
} // setPlayerKarts
|
} // setPlayerKarts
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -5368,6 +5401,9 @@ void ServerLobby::handleKartInfo(Event* event)
|
|||||||
.addUInt32(rki.getOnlineId()).addUInt8(rki.getHandicap())
|
.addUInt32(rki.getOnlineId()).addUInt8(rki.getHandicap())
|
||||||
.addUInt8((uint8_t)rki.getLocalPlayerId())
|
.addUInt8((uint8_t)rki.getLocalPlayerId())
|
||||||
.encodeString(rki.getKartName()).encodeString(rki.getCountryCode());
|
.encodeString(rki.getKartName()).encodeString(rki.getCountryCode());
|
||||||
|
if (peer->getClientCapabilities().find("real_addon_karts") !=
|
||||||
|
peer->getClientCapabilities().end())
|
||||||
|
rki.getKartData().encode(ns);
|
||||||
peer->sendPacket(ns, true/*reliable*/);
|
peer->sendPacket(ns, true/*reliable*/);
|
||||||
delete ns;
|
delete ns;
|
||||||
} // handleKartInfo
|
} // handleKartInfo
|
||||||
|
@ -30,5 +30,6 @@ void RemoteKartInfo::copyFrom(std::shared_ptr<NetworkPlayerProfile> p,
|
|||||||
m_default_kart_color = p->getDefaultKartColor();
|
m_default_kart_color = p->getDefaultKartColor();
|
||||||
m_online_id = p->getOnlineId();
|
m_online_id = p->getOnlineId();
|
||||||
m_country_code = p->getCountryCode();
|
m_country_code = p->getCountryCode();
|
||||||
|
m_kart_data = p->getKartData();
|
||||||
m_profile = p;
|
m_profile = p;
|
||||||
} // copyFrom
|
} // copyFrom
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#ifndef HEADER_REMOTE_KART_INFO_HPP
|
#ifndef HEADER_REMOTE_KART_INFO_HPP
|
||||||
#define HEADER_REMOTE_KART_INFO_HPP
|
#define HEADER_REMOTE_KART_INFO_HPP
|
||||||
|
|
||||||
|
#include "network/kart_data.hpp"
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -59,6 +61,7 @@ class RemoteKartInfo
|
|||||||
uint32_t m_online_id;
|
uint32_t m_online_id;
|
||||||
std::string m_country_code;
|
std::string m_country_code;
|
||||||
std::weak_ptr<NetworkPlayerProfile> m_profile;
|
std::weak_ptr<NetworkPlayerProfile> m_profile;
|
||||||
|
KartData m_kart_data;
|
||||||
public:
|
public:
|
||||||
RemoteKartInfo(int player_id, const std::string& kart_name,
|
RemoteKartInfo(int player_id, const std::string& kart_name,
|
||||||
const irr::core::stringw& user_name, uint32_t host_id,
|
const irr::core::stringw& user_name, uint32_t host_id,
|
||||||
@ -107,6 +110,8 @@ public:
|
|||||||
uint32_t getOnlineId() const { return m_online_id; }
|
uint32_t getOnlineId() const { return m_online_id; }
|
||||||
void setCountryCode(const std::string& id) { m_country_code = id; }
|
void setCountryCode(const std::string& id) { m_country_code = id; }
|
||||||
const std::string& getCountryCode() const { return m_country_code; }
|
const std::string& getCountryCode() const { return m_country_code; }
|
||||||
|
void setKartData(const KartData& data) { m_kart_data = data; }
|
||||||
|
const KartData& getKartData() const { return m_kart_data; }
|
||||||
void setNetworkPlayerProfile(
|
void setNetworkPlayerProfile(
|
||||||
std::weak_ptr<NetworkPlayerProfile> npp) { m_profile = npp; }
|
std::weak_ptr<NetworkPlayerProfile> npp) { m_profile = npp; }
|
||||||
std::weak_ptr<NetworkPlayerProfile> getNetworkPlayerProfile() const
|
std::weak_ptr<NetworkPlayerProfile> getNetworkPlayerProfile() const
|
||||||
|
@ -273,6 +273,13 @@ namespace ServerConfig
|
|||||||
"will be made 1.0. If false addon karts will use their original "
|
"will be made 1.0. If false addon karts will use their original "
|
||||||
"hitbox other than tux, all players having it restriction applies."));
|
"hitbox other than tux, all players having it restriction applies."));
|
||||||
|
|
||||||
|
SERVER_CFG_PREFIX BoolServerConfigParam m_real_addon_karts
|
||||||
|
SERVER_CFG_DEFAULT(BoolServerConfigParam(true, "real-addon-karts",
|
||||||
|
"If true, server will send its addon karts real phyics (kart size, "
|
||||||
|
"length, type, etc) to client. If false or client chooses an addon "
|
||||||
|
"kart which server is missing, tux's kart physics and kart type of "
|
||||||
|
"the original addon is sent."));
|
||||||
|
|
||||||
SERVER_CFG_PREFIX FloatServerConfigParam m_flag_return_timeout
|
SERVER_CFG_PREFIX FloatServerConfigParam m_flag_return_timeout
|
||||||
SERVER_CFG_DEFAULT(FloatServerConfigParam(20.0f, "flag-return-timeout",
|
SERVER_CFG_DEFAULT(FloatServerConfigParam(20.0f, "flag-return-timeout",
|
||||||
"Time in seconds when a flag is dropped a by player in CTF "
|
"Time in seconds when a flag is dropped a by player in CTF "
|
||||||
|
@ -882,9 +882,11 @@ void KartSelectionScreen::updateKartStats(uint8_t widget_id,
|
|||||||
|
|
||||||
const KartProperties *kp =
|
const KartProperties *kp =
|
||||||
kart_properties_manager->getKart(selection);
|
kart_properties_manager->getKart(selection);
|
||||||
|
NetworkConfig* nc = NetworkConfig::get();
|
||||||
// Adjust for online addon karts
|
// Adjust for online addon karts
|
||||||
if (kp && kp->isAddon() && NetworkConfig::get()->isNetworking() &&
|
if (kp && kp->isAddon() && nc->isNetworking() && nc->useTuxHitboxAddon() &&
|
||||||
NetworkConfig::get()->useTuxHitboxAddon())
|
nc->getServerCapabilities().find(
|
||||||
|
"real_addon_karts") == nc->getServerCapabilities().end())
|
||||||
kp = kart_properties_manager->getKart("tux");
|
kp = kart_properties_manager->getKart("tux");
|
||||||
if (kp != NULL)
|
if (kp != NULL)
|
||||||
{
|
{
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
|
|
||||||
#include "config/user_config.hpp"
|
#include "config/user_config.hpp"
|
||||||
#include "guiengine/widgets/progress_bar_widget.hpp"
|
#include "guiengine/widgets/progress_bar_widget.hpp"
|
||||||
|
#include "karts/kart_properties.hpp"
|
||||||
|
#include "karts/kart_properties_manager.hpp"
|
||||||
#include "input/device_manager.hpp"
|
#include "input/device_manager.hpp"
|
||||||
#include "network/network_config.hpp"
|
#include "network/network_config.hpp"
|
||||||
#include "network/network_string.hpp"
|
#include "network/network_string.hpp"
|
||||||
@ -137,6 +139,22 @@ void NetworkKartSelectionScreen::allPlayersDone()
|
|||||||
// kart
|
// kart
|
||||||
kart.encodeString(m_kart_widgets[n].m_kart_internal_name);
|
kart.encodeString(m_kart_widgets[n].m_kart_internal_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetworkConfig* nc = NetworkConfig::get();
|
||||||
|
if (nc->useTuxHitboxAddon() &&
|
||||||
|
nc->getServerCapabilities().find(
|
||||||
|
"real_addon_karts") != nc->getServerCapabilities().end())
|
||||||
|
{
|
||||||
|
for (unsigned n = 0; n < kart_count; n++)
|
||||||
|
{
|
||||||
|
KartData kart_data;
|
||||||
|
const KartProperties* kp = kart_properties_manager
|
||||||
|
->getKart(m_kart_widgets[n].m_kart_internal_name);
|
||||||
|
if (kp && kp->isAddon())
|
||||||
|
kart_data = KartData(kp);
|
||||||
|
kart_data.encode(&kart);
|
||||||
|
}
|
||||||
|
}
|
||||||
STKHost::get()->sendToServer(&kart, true);
|
STKHost::get()->sendToServer(&kart, true);
|
||||||
|
|
||||||
// ---- Switch to assign mode
|
// ---- Switch to assign mode
|
||||||
|
Loading…
Reference in New Issue
Block a user