diff --git a/apps/openmw/mwmp/Cell.cpp b/apps/openmw/mwmp/Cell.cpp index 47c1f435d..6757cc227 100644 --- a/apps/openmw/mwmp/Cell.cpp +++ b/apps/openmw/mwmp/Cell.cpp @@ -23,11 +23,21 @@ mwmp::Cell::Cell(MWWorld::CellStore* cellStore) std::map localActors; std::map dedicatedActors; + + updateTimer = 0; } void Cell::updateLocal(bool forceUpdate) { - if (localActors.empty()) return; + if (localActors.empty()) + return; + + const float timeoutSec = 0.025; + + if (!forceUpdate && (updateTimer += MWBase::Environment::get().getFrameDuration()) < timeoutSec) + return; + else + updateTimer = 0; CellController *cellController = Main::get().getCellController(); ActorList *actorList = mwmp::Main::get().getNetworking()->getActorList(); diff --git a/apps/openmw/mwmp/Cell.hpp b/apps/openmw/mwmp/Cell.hpp index caccf0ce9..e6cd5ca77 100644 --- a/apps/openmw/mwmp/Cell.hpp +++ b/apps/openmw/mwmp/Cell.hpp @@ -52,6 +52,8 @@ namespace mwmp std::map localActors; std::map dedicatedActors; + + float updateTimer; }; } diff --git a/apps/openmw/mwmp/LocalActor.cpp b/apps/openmw/mwmp/LocalActor.cpp index 08053ac7f..2635c38ba 100644 --- a/apps/openmw/mwmp/LocalActor.cpp +++ b/apps/openmw/mwmp/LocalActor.cpp @@ -31,9 +31,6 @@ LocalActor::LocalActor() wasForceMoveJumping = false; wasFlying = false; - positionTimer = 0; - statTimer = 0; - attack.type = Attack::MELEE; attack.shouldSend = false; @@ -75,23 +72,16 @@ void LocalActor::updateCell() void LocalActor::updatePosition(bool forceUpdate) { - const float timeoutSec = 0.03; + bool posIsChanging = (direction.pos[0] != 0 || direction.pos[1] != 0 || direction.pos[2] != 0 || + direction.rot[0] != 0 || direction.rot[1] != 0 || direction.rot[2] != 0); - if (forceUpdate || (positionTimer += MWBase::Environment::get().getFrameDuration()) >= timeoutSec) + if (forceUpdate || posIsChanging || posWasChanged) { - bool posIsChanging = (direction.pos[0] != 0 || direction.pos[1] != 0 || direction.pos[2] != 0 || - direction.rot[0] != 0 || direction.rot[1] != 0 || direction.rot[2] != 0); + posWasChanged = posIsChanging; - if (forceUpdate || posIsChanging || posWasChanged) - { - posWasChanged = posIsChanging; + position = ptr.getRefData().getPosition(); - position = ptr.getRefData().getPosition(); - - positionTimer = 0; - - mwmp::Main::get().getNetworking()->getActorList()->addPositionActor(*this); - } + mwmp::Main::get().getNetworking()->getActorList()->addPositionActor(*this); } } @@ -167,39 +157,32 @@ void LocalActor::updateStatsDynamic(bool forceUpdate) MWMechanics::DynamicStat magicka(ptrCreatureStats->getMagicka()); MWMechanics::DynamicStat fatigue(ptrCreatureStats->getFatigue()); - const float timeoutSec = 0.5; + // Update stats when they become 0 or they have changed enough + // + // Also check for an oldHealth of 0 changing to something else for resurrected NPCs + bool shouldUpdateHealth = oldHealth != health && (health.getCurrent() == 0 || oldHealth.getCurrent() == 0 || abs(oldHealth.getCurrent() - health.getCurrent()) > 5); + bool shouldUpdateMagicka = false; + bool shouldUpdateFatigue = false; - if (forceUpdate || (statTimer += MWBase::Environment::get().getFrameDuration()) >= timeoutSec) - { - // Update stats when they become 0 or they have changed enough - // - // Also check for an oldHealth of 0 changing to something else for resurrected NPCs - bool shouldUpdateHealth = oldHealth != health && (health.getCurrent() == 0 || oldHealth.getCurrent() == 0 || abs(oldHealth.getCurrent() - health.getCurrent()) > 5); - bool shouldUpdateMagicka = false; - bool shouldUpdateFatigue = false; + if (!shouldUpdateHealth) + shouldUpdateMagicka = oldMagicka != magicka && (magicka.getCurrent() == 0 || abs(oldMagicka.getCurrent() - magicka.getCurrent()) > 10); - if (!shouldUpdateHealth) - shouldUpdateMagicka = oldMagicka != magicka && (magicka.getCurrent() == 0 || abs(oldMagicka.getCurrent() - magicka.getCurrent()) > 10); - - if (!shouldUpdateMagicka) - shouldUpdateFatigue = oldFatigue != fatigue && (fatigue.getCurrent() == 0 || abs(oldFatigue.getCurrent() - fatigue.getCurrent()) > 10); + if (!shouldUpdateMagicka) + shouldUpdateFatigue = oldFatigue != fatigue && (fatigue.getCurrent() == 0 || abs(oldFatigue.getCurrent() - fatigue.getCurrent()) > 10); - if (forceUpdate || shouldUpdateHealth || shouldUpdateMagicka || shouldUpdateFatigue) - { - oldHealth = health; - oldMagicka = magicka; - oldFatigue = fatigue; + if (forceUpdate || shouldUpdateHealth || shouldUpdateMagicka || shouldUpdateFatigue) + { + oldHealth = health; + oldMagicka = magicka; + oldFatigue = fatigue; - health.writeState(creatureStats.mDynamic[0]); - magicka.writeState(creatureStats.mDynamic[1]); - fatigue.writeState(creatureStats.mDynamic[2]); + health.writeState(creatureStats.mDynamic[0]); + magicka.writeState(creatureStats.mDynamic[1]); + fatigue.writeState(creatureStats.mDynamic[2]); - creatureStats.mDead = ptrCreatureStats->isDead(); + creatureStats.mDead = ptrCreatureStats->isDead(); - statTimer = 0; - - mwmp::Main::get().getNetworking()->getActorList()->addStatsDynamicActor(*this); - } + mwmp::Main::get().getNetworking()->getActorList()->addStatsDynamicActor(*this); } } diff --git a/apps/openmw/mwmp/LocalActor.hpp b/apps/openmw/mwmp/LocalActor.hpp index 991a6a028..c78358f98 100644 --- a/apps/openmw/mwmp/LocalActor.hpp +++ b/apps/openmw/mwmp/LocalActor.hpp @@ -47,9 +47,6 @@ namespace mwmp MWMechanics::DynamicStat oldHealth; MWMechanics::DynamicStat oldMagicka; MWMechanics::DynamicStat oldFatigue; - - float positionTimer; - float statTimer; }; }