Add maximum number of moveable objects in networking games

This commit is contained in:
Benau 2018-11-09 21:17:38 +08:00
parent 9061d527df
commit 87ce3931e5
6 changed files with 46 additions and 10 deletions

View File

@ -206,8 +206,13 @@
steering-reduction: Reduce a remote kart's steering by this factor
each frame. This helps reduces oversteering by high latency
clients when they only do minor steering adjustments.
max-moveable-objects: Maximum number of moveable objects in a track
when networking is on. Objects will be hidden if total count is
larger than this value.
-->
<networking state-frequency="10" steering-reduction="1.0"/>
<networking state-frequency="10"
steering-reduction="1.0"
max-moveable-objects="15"/>
<!-- The field od views for 1-4 player split screen. fov-3 is
actually not used (since 3 player split screen uses the
@ -541,6 +546,6 @@
<!-- List of default ports used, by default STK use random ports for client.
The server discovery port has to be the same across all clients and servers.
-->
<network server-discovery-port="2757" client-port="2758" server-port="2759"/>
<network-ports server-discovery-port="2757" client-port="2758" server-port="2759"/>
</config>

View File

@ -152,10 +152,10 @@ void STKConfig::load(const std::string &filename)
CHECK_NEG(m_default_track_friction, "physics default-track-friction");
CHECK_NEG(m_physics_fps, "physics fps" );
CHECK_NEG(m_network_state_frequeny, "network state-frequency" );
CHECK_NEG(m_max_moveable_objects, "network max-moveable-objects");
CHECK_NEG(m_network_steering_reduction,"network steering-reduction" );
CHECK_NEG(m_default_moveable_friction, "physics default-moveable-friction");
CHECK_NEG(m_solver_iterations, "physics: solver-iterations" );
CHECK_NEG(m_network_state_frequeny, "network solver-state-frequency" );
CHECK_NEG(m_solver_split_impulse_thresh,"physics: solver-split-impulse-threshold");
// Square distance to make distance checks cheaper (no sqrt)
@ -199,6 +199,7 @@ void STKConfig::init_defaults()
m_donate_url = "";
m_password_reset_url = "";
m_network_state_frequeny = -100;
m_max_moveable_objects = -100;
m_solver_iterations = -100;
m_solver_set_flags = 0;
m_solver_reset_flags = 0;
@ -436,6 +437,7 @@ void STKConfig::getAllData(const XMLNode * root)
if (const XMLNode *networking_node = root->getNode("networking"))
{
networking_node->get("state-frequency", &m_network_state_frequeny);
networking_node->get("max-moveable-objects", &m_max_moveable_objects);
networking_node->get("steering-reduction", &m_network_steering_reduction);
}
@ -477,14 +479,14 @@ void STKConfig::getAllData(const XMLNode * root)
tc->get("quality", &m_tc_quality);
}
if (const XMLNode *tc = root->getNode("network"))
if (const XMLNode *np = root->getNode("network-ports"))
{
unsigned server_discovery_port = 0;
unsigned client_port = 0;
unsigned server_port = 0;
tc->get("server-discovery-port", &server_discovery_port);
tc->get("client-port", &client_port);
tc->get("server-port", &server_port);
np->get("server-discovery-port", &server_discovery_port);
np->get("client-port", &client_port);
np->get("server-port", &server_port);
m_server_discovery_port = (uint16_t)server_discovery_port;
m_client_port = (uint16_t)client_port;
m_server_port = (uint16_t)server_port;

View File

@ -89,6 +89,9 @@ public:
/** How many state updates per second the server will send. */
int m_network_state_frequeny;
/** Maximum number of moveable objects in a track when networking is on. */
int m_max_moveable_objects;
/** In case of a network race, remote karts will get their steering somewhat
* reduced each frame. This reduces stutter when a kart only does small
* steering adjustments. */

View File

@ -122,7 +122,6 @@ void SoccerWorld::init()
Log::fatal("SoccerWorld","Ball is missing in soccer field, abort.");
m_bgd.init(m_ball->getPhysicalObject()->getRadius());
m_ball_body->setActivationState(DISABLE_DEACTIVATION);
} // init

View File

@ -232,6 +232,8 @@ public:
// ------------------------------------------------------------------------
void setPaused(bool mode){ m_animator->setPaused(mode); }
// ------------------------------------------------------------------------
void setInitiallyVisible(bool val) { m_initially_visible = val; }
// ------------------------------------------------------------------------
/** Returns if a kart can drive on this object. */
bool isDriveable() const { return m_is_driveable; }
// ------------------------------------------------------------------------

View File

@ -20,9 +20,11 @@
#include "animations/ipo.hpp"
#include "animations/three_d_animation.hpp"
#include "config/stk_config.hpp"
#include "graphics/lod_node.hpp"
#include "graphics/material_manager.hpp"
#include "io/xml_node.hpp"
#include "network/network_config.hpp"
#include "physics/physical_object.hpp"
#include "tracks/track_object.hpp"
#include "utils/log.hpp"
@ -66,14 +68,37 @@ void TrackObjectManager::add(const XMLNode &xml_node, scene::ISceneNode* parent,
*/
void TrackObjectManager::init()
{
for_var_in(TrackObject*, curr, m_all_objects)
int moveable_objects = 0;
bool warned = false;
for (unsigned i = 0; i < m_all_objects.m_contents_vector.size(); i++)
{
TrackObject* curr = m_all_objects.m_contents_vector[i];
curr->onWorldReady();
if (moveable_objects > stk_config->m_max_moveable_objects)
{
if (!warned)
{
Log::warn("TrackObjectManager",
"Too many moveable objects (>%d) in networking.",
stk_config->m_max_moveable_objects);
warned = true;
}
curr->setInitiallyVisible(false);
curr->setEnabled(false);
continue;
}
// onWorldReady will hide some track objects using scripting
if (curr->isEnabled() && curr->getPhysicalObject() &&
if (NetworkConfig::get()->isNetworking() &&
curr->isEnabled() && curr->getPhysicalObject() &&
curr->getPhysicalObject()->isDynamic())
{
curr->getPhysicalObject()->getBody()
->setActivationState(DISABLE_DEACTIVATION);
curr->getPhysicalObject()->addForRewind();
moveable_objects++;
}
}
} // init