+#pragma once
+
+#include "registry.qh"
+#include "sort.qh"
+#include "yenc.qh"
+
+.string netname;
+.int m_id;
+.bool(entity this, entity sender, bool isNew) m_read;
+#define NET_HANDLE(id, param) bool Net_Handle_##id(entity this, entity sender, param)
+
+
+#ifdef CSQC
+ #define REGISTER_NET_TEMP(id) \
+ NET_HANDLE(id, bool); \
+ REGISTER(TempEntities, NET, id, m_id, new_pure(net_temp_packet)) \
+ { \
+ this.netname = #id; \
+ this.m_read = Net_Handle_##id; \
+ }
+#else
+ #define REGISTER_NET_TEMP(id) \
+ const bool NET_##id##_istemp = true; \
+ REGISTER(TempEntities, NET, id, m_id, new_pure(net_temp_packet)) \
+ { \
+ this.netname = #id; \
+ }
+#endif
+#define REGISTER_NET_S2C(id) REGISTER_NET_TEMP(id)
+
+REGISTRY(TempEntities, BITS(8) - 80)
+#define TempEntities_from(i) _TempEntities_from(i, NULL)
+REGISTER_REGISTRY(TempEntities)
+REGISTRY_SORT(TempEntities)
+REGISTRY_CHECK(TempEntities)
+STATIC_INIT(RegisterTempEntities_renumber) { FOREACH(TempEntities, true, it.m_id = 80 + i); }
+
+
+
+#ifdef CSQC
+ #define REGISTER_NET_LINKED(id) \
+ [[accumulate]] NET_HANDLE(id, bool isnew) \
+ { \
+ this = __self; \
+ this.sourceLoc = __FILE__ ":" STR(__LINE__); \
+ if (!this) isnew = true; \
+ } \
+ REGISTER(LinkedEntities, NET, id, m_id, new_pure(net_linked_packet)) \
+ { \
+ this.netname = #id; \
+ this.m_read = Net_Handle_##id; \
+ }
+#else
+ #define REGISTER_NET_LINKED(id) \
+ const bool NET_##id##_istemp = false; \
+ REGISTER(LinkedEntities, NET, id, m_id, new_pure(net_linked_packet)) \
+ { \
+ this.netname = #id; \
+ }
+#endif
+
+REGISTRY(LinkedEntities, BITS(8) - 1)
+#define LinkedEntities_from(i) _LinkedEntities_from(i, NULL)
+REGISTER_REGISTRY(LinkedEntities)
+REGISTRY_SORT(LinkedEntities)
+REGISTRY_CHECK(LinkedEntities)
+STATIC_INIT(RegisterLinkedEntities_renumber) { FOREACH(LinkedEntities, true, it.m_id = 1 + i); }
+
+