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

summaryrefslogtreecommitdiff
path: root/source/core/StarNetElementExt.hpp
blob: 50802fe00df9b31afa329ac67be6740db3056eba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#pragma once

#include "StarNetElement.hpp"

namespace Star {

template <typename BaseNetElement>
class NetElementOverride : public BaseNetElement {
public:
  void netStore(DataStream& ds, NetCompatibilityRules rules = {}) const override;
  void netLoad(DataStream& ds, NetCompatibilityRules rules) override;

  bool writeNetDelta(DataStream& ds, uint64_t fromVersion, NetCompatibilityRules rules = {}) const override;
  void readNetDelta(DataStream& ds, float interpolationTime = 0.0f, NetCompatibilityRules rules = {}) override;

  typedef std::function<void(DataStream&, NetCompatibilityRules)> NetStorer;
  typedef std::function<void(DataStream&, NetCompatibilityRules)> NetLoader;
  typedef std::function<bool(DataStream&, uint64_t, NetCompatibilityRules)> NetDeltaWriter;
  typedef std::function<void(DataStream&, float, NetCompatibilityRules)> NetDeltaReader;

  void setNetStorer(NetStorer);
  void setNetLoader(NetLoader);
  void setNetDeltaWriter(NetDeltaWriter);
  void setNetDeltaReader(NetDeltaReader);
  void setOverrides(NetStorer netStorer, NetLoader netLoader,
    NetDeltaWriter netDeltaWriter, NetDeltaReader netDeltaReader);

private:
  NetStorer m_netStorer;
  NetLoader m_netLoader;
  
  NetDeltaWriter m_netDeltaWriter;
  NetDeltaReader m_netDeltaReader;
};

template <typename BaseNetElement>
void NetElementOverride<BaseNetElement>::netStore(DataStream& ds, NetCompatibilityRules rules) const {
  if (m_netStorer)
    m_netStorer(ds, rules);
  else
    BaseNetElement::netStore(ds, rules);
}

template <typename BaseNetElement>
void NetElementOverride<BaseNetElement>::netLoad(DataStream& ds, NetCompatibilityRules rules) {
  if (m_netLoader)
    m_netLoader(ds, rules);
  else
    BaseNetElement::netLoad(ds, rules);
}

template <typename BaseNetElement>
bool NetElementOverride<BaseNetElement>::writeNetDelta(DataStream& ds, uint64_t fromVersion, NetCompatibilityRules rules) const {
  if (m_netDeltaWriter)
    return m_netDeltaWriter(ds, fromVersion, rules);
  else
    return BaseNetElement::writeNetDelta(ds, fromVersion, rules);
}

template <typename BaseNetElement>
void NetElementOverride<BaseNetElement>::readNetDelta(DataStream& ds, float interpolationTime, NetCompatibilityRules rules) {
  if (m_netDeltaReader)
    m_netDeltaReader(ds, interpolationTime, rules);
  else
    BaseNetElement::readNetDelta(ds, interpolationTime, rules);
}

template <typename BaseNetElement>
inline void NetElementOverride<BaseNetElement>::setNetStorer(NetStorer f) { m_netStorer = std::move(f); }
template <typename BaseNetElement>
inline void NetElementOverride<BaseNetElement>::setNetLoader(NetLoader f) { m_netLoader = std::move(f); }
template <typename BaseNetElement>
inline void NetElementOverride<BaseNetElement>::setNetDeltaWriter(NetDeltaWriter f) { m_netDeltaWriter = std::move(f); }
template <typename BaseNetElement>
inline void NetElementOverride<BaseNetElement>::setNetDeltaReader(NetDeltaReader f) { m_netDeltaReader = std::move(f); }

template <typename BaseNetElement>
inline void NetElementOverride<BaseNetElement>::setOverrides(NetStorer netStorer, NetLoader netLoader, NetDeltaWriter netDeltaWriter, NetDeltaReader netDeltaReader) {
  m_netStorer = std::move(netStorer);
  m_netLoader = std::move(netLoader);
  m_netDeltaWriter = std::move(netDeltaWriter);
  m_netDeltaReader = std::move(netDeltaReader);
}

}