Add confirmation of kart animation for network
This commit is contained in:
@@ -42,9 +42,9 @@ AbstractKartAnimation::AbstractKartAnimation(AbstractKart *kart,
|
||||
m_name = name;
|
||||
m_end_transform = btTransform(btQuaternion(0.0f, 0.0f, 0.0f, 1.0f));
|
||||
m_end_transform.setOrigin(Vec3(std::numeric_limits<float>::max()));
|
||||
m_set_end_transform_by_network = NetworkConfig::get()->isNetworking() &&
|
||||
NetworkConfig::get()->isClient() ? false : true;
|
||||
m_created_ticks = World::getWorld()->getTicksSinceStart();
|
||||
m_check_created_ticks = std::make_shared<int>(-1);
|
||||
m_confirmed_by_network = false;
|
||||
// Remove previous animation if there is one
|
||||
#ifndef DEBUG
|
||||
// Use this code in non-debug mode to avoid a memory leak (and messed
|
||||
@@ -98,8 +98,7 @@ AbstractKartAnimation::~AbstractKartAnimation()
|
||||
m_kart->setTrans(transform);
|
||||
Physics::getInstance()->addKart(m_kart);
|
||||
|
||||
if (RewindManager::get()->useLocalEvent() &&
|
||||
m_set_end_transform_by_network)
|
||||
if (RewindManager::get()->useLocalEvent())
|
||||
{
|
||||
AbstractKart* kart = m_kart;
|
||||
Vec3 angular_velocity = kart->getBody()->getAngularVelocity();
|
||||
@@ -122,6 +121,39 @@ AbstractKartAnimation::~AbstractKartAnimation()
|
||||
}
|
||||
} // ~AbstractKartAnimation
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void AbstractKartAnimation::addNetworkAnimationChecker()
|
||||
{
|
||||
if (NetworkConfig::get()->isNetworking() &&
|
||||
NetworkConfig::get()->isClient())
|
||||
{
|
||||
std::weak_ptr<int> cct = m_check_created_ticks;
|
||||
RewindManager::get()->addRewindInfoEventFunction(new
|
||||
RewindInfoEventFunction(m_created_ticks,
|
||||
[](){},
|
||||
[](){},
|
||||
/*delete_function*/[cct]()
|
||||
{
|
||||
auto cct_sp = cct.lock();
|
||||
if (!cct_sp)
|
||||
return;
|
||||
*cct_sp = World::getWorld()->getTicksSinceStart();
|
||||
}));
|
||||
}
|
||||
} // addNetworkAnimationChecker
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
void AbstractKartAnimation::checkNetworkAnimationCreationSucceed()
|
||||
{
|
||||
if (!m_confirmed_by_network && *m_check_created_ticks != -1 &&
|
||||
World::getWorld()->getTicksSinceStart() > *m_check_created_ticks)
|
||||
{
|
||||
Log::warn("AbstractKartAnimation",
|
||||
"No animation has been created on server, remove locally.");
|
||||
m_timer = -1.0f;
|
||||
}
|
||||
} // checkNetworkAnimationCreationSucceed
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
/** Updates the timer, and if it expires (<0), the kart animation will be
|
||||
* removed from the kart and this object will be deleted.
|
||||
@@ -139,17 +171,4 @@ void AbstractKartAnimation::update(float dt)
|
||||
if(m_kart) m_kart->setKartAnimation(NULL);
|
||||
delete this;
|
||||
}
|
||||
// Delete animation in client if after 1 second no end transform
|
||||
// confirmation from network
|
||||
if (NetworkConfig::get()->isNetworking() &&
|
||||
NetworkConfig::get()->isClient() && !m_set_end_transform_by_network &&
|
||||
World::getWorld()->getTicksSinceStart() > m_created_ticks + 120)
|
||||
{
|
||||
Log::warn("AbstractKartAnimation",
|
||||
"No animation has been created on server, remove locally.");
|
||||
m_timer = -1.0f;
|
||||
if (m_kart)
|
||||
m_kart->setKartAnimation(NULL);
|
||||
delete this;
|
||||
}
|
||||
} // update
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "utils/no_copy.hpp"
|
||||
#include "utils/vec3.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class AbstractKart;
|
||||
@@ -43,8 +44,12 @@ private:
|
||||
/** Name of this animation, used for debug prints only. */
|
||||
std::string m_name;
|
||||
|
||||
std::shared_ptr<int> m_check_created_ticks;
|
||||
|
||||
int m_created_ticks;
|
||||
|
||||
bool m_confirmed_by_network;
|
||||
|
||||
protected:
|
||||
/** A pointer to the kart which is animated by this class. */
|
||||
AbstractKart *m_kart;
|
||||
@@ -54,8 +59,8 @@ protected:
|
||||
|
||||
btTransform m_end_transform;
|
||||
|
||||
bool m_set_end_transform_by_network;
|
||||
|
||||
// ------------------------------------------------------------------------
|
||||
void addNetworkAnimationChecker();
|
||||
public:
|
||||
AbstractKartAnimation(AbstractKart *kart,
|
||||
const std::string &name);
|
||||
@@ -77,9 +82,12 @@ public:
|
||||
{
|
||||
if (!useEarlyEndTransform())
|
||||
return;
|
||||
m_set_end_transform_by_network = true;
|
||||
m_confirmed_by_network = true;
|
||||
m_end_transform = t;
|
||||
}
|
||||
// ----------------------------------------------------------------------------
|
||||
void checkNetworkAnimationCreationSucceed();
|
||||
|
||||
}; // AbstractKartAnimation
|
||||
|
||||
#endif
|
||||
|
||||
@@ -48,7 +48,6 @@ CannonAnimation::CannonAnimation(AbstractKart *kart, Ipo *ipo,
|
||||
float skid_rot)
|
||||
: AbstractKartAnimation(kart, "CannonAnimation")
|
||||
{
|
||||
m_set_end_transform_by_network = true;
|
||||
m_flyable = NULL;
|
||||
init(ipo, start_left, start_right, end_left, end_right, skid_rot);
|
||||
} // CannonAnimation
|
||||
|
||||
@@ -110,6 +110,7 @@ ExplosionAnimation::ExplosionAnimation(AbstractKart *kart,
|
||||
m_kart->showStarEffect(t);
|
||||
|
||||
m_kart->getAttachment()->clear();
|
||||
addNetworkAnimationChecker();
|
||||
} // ExplosionAnimation
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
@@ -79,11 +79,14 @@ void KartRewinder::saveTransform()
|
||||
// ----------------------------------------------------------------------------
|
||||
void KartRewinder::computeError()
|
||||
{
|
||||
if (!getKartAnimation())
|
||||
AbstractKartAnimation* ka = getKartAnimation();
|
||||
if (ka == NULL)
|
||||
{
|
||||
Moveable::checkSmoothing();
|
||||
m_skidding->checkSmoothing();
|
||||
}
|
||||
else
|
||||
ka->checkNetworkAnimationCreationSucceed();
|
||||
|
||||
float diff = fabsf(m_prev_steering - AbstractKart::getSteerPercent());
|
||||
if (diff > 0.05f)
|
||||
|
||||
@@ -99,6 +99,7 @@ RescueAnimation::RescueAnimation(AbstractKart *kart, bool is_auto_rescue)
|
||||
world->increaseRescueCount();
|
||||
}
|
||||
|
||||
addNetworkAnimationChecker();
|
||||
} // RescueAnimation
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user