Add confirmation of kart animation for network

This commit is contained in:
Benau
2018-08-07 02:26:34 +08:00
parent b4783d82f6
commit 8ab2368e2d
6 changed files with 53 additions and 22 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -110,6 +110,7 @@ ExplosionAnimation::ExplosionAnimation(AbstractKart *kart,
m_kart->showStarEffect(t);
m_kart->getAttachment()->clear();
addNetworkAnimationChecker();
} // ExplosionAnimation
//-----------------------------------------------------------------------------

View File

@@ -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)

View File

@@ -99,6 +99,7 @@ RescueAnimation::RescueAnimation(AbstractKart *kart, bool is_auto_rescue)
world->increaseRescueCount();
}
addNetworkAnimationChecker();
} // RescueAnimation
//-----------------------------------------------------------------------------