Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarNetElementSyncGroup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/StarNetElementSyncGroup.cpp')
-rw-r--r--source/core/StarNetElementSyncGroup.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/source/core/StarNetElementSyncGroup.cpp b/source/core/StarNetElementSyncGroup.cpp
new file mode 100644
index 0000000..4ead00f
--- /dev/null
+++ b/source/core/StarNetElementSyncGroup.cpp
@@ -0,0 +1,88 @@
+#include "StarNetElementSyncGroup.hpp"
+
+namespace Star {
+
+void NetElementSyncGroup::enableNetInterpolation(float extrapolationHint) {
+ NetElementGroup::enableNetInterpolation(extrapolationHint);
+ if (m_hasRecentChanges)
+ netElementsNeedLoad(false);
+}
+
+void NetElementSyncGroup::disableNetInterpolation() {
+ NetElementGroup::disableNetInterpolation();
+ if (m_hasRecentChanges)
+ netElementsNeedLoad(false);
+}
+
+void NetElementSyncGroup::tickNetInterpolation(float dt) {
+ NetElementGroup::tickNetInterpolation(dt);
+ if (m_hasRecentChanges) {
+ m_recentDeltaTime -= dt;
+ if (netInterpolationEnabled())
+ netElementsNeedLoad(false);
+
+ if (m_recentDeltaTime < 0.0f && m_recentDeltaWasBlank)
+ m_hasRecentChanges = false;
+ }
+}
+
+void NetElementSyncGroup::netStore(DataStream& ds) const {
+ const_cast<NetElementSyncGroup*>(this)->netElementsNeedStore();
+ return NetElementGroup::netStore(ds);
+}
+
+void NetElementSyncGroup::netLoad(DataStream& ds) {
+ NetElementGroup::netLoad(ds);
+ netElementsNeedLoad(true);
+}
+
+bool NetElementSyncGroup::writeNetDelta(DataStream& ds, uint64_t fromVersion) const {
+ const_cast<NetElementSyncGroup*>(this)->netElementsNeedStore();
+ return NetElementGroup::writeNetDelta(ds, fromVersion);
+}
+
+void NetElementSyncGroup::readNetDelta(DataStream& ds, float interpolationTime) {
+ NetElementGroup::readNetDelta(ds, interpolationTime);
+
+ m_hasRecentChanges = true;
+ m_recentDeltaTime = interpolationTime;
+ m_recentDeltaWasBlank = false;
+
+ netElementsNeedLoad(false);
+}
+
+void NetElementSyncGroup::blankNetDelta(float interpolationTime) {
+ NetElementGroup::blankNetDelta(interpolationTime);
+
+ if (!m_recentDeltaWasBlank) {
+ m_recentDeltaTime = interpolationTime;
+ m_recentDeltaWasBlank = true;
+ }
+
+ if (m_hasRecentChanges && netInterpolationEnabled())
+ netElementsNeedLoad(false);
+}
+
+void NetElementSyncGroup::netElementsNeedLoad(bool) {}
+
+void NetElementSyncGroup::netElementsNeedStore() {}
+
+void NetElementCallbackGroup::setNeedsLoadCallback(function<void(bool)> needsLoadCallback) {
+ m_netElementsNeedLoad = move(needsLoadCallback);
+}
+
+void NetElementCallbackGroup::setNeedsStoreCallback(function<void()> needsStoreCallback) {
+ m_netElementsNeedStore = move(needsStoreCallback);
+}
+
+void NetElementCallbackGroup::netElementsNeedLoad(bool load) {
+ if (m_netElementsNeedLoad)
+ m_netElementsNeedLoad(load);
+}
+
+void NetElementCallbackGroup::netElementsNeedStore() {
+ if (m_netElementsNeedStore)
+ m_netElementsNeedStore();
+}
+
+}