]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/lib/net.qh
Reorganise item code so that VM-specific code is in its correct directories and not...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / net.qh
index b1f5326a9bb5a441b5094de347cfe973086d5bd6..522b4ff2301f86b4e22f8c6d008e79a4f8103f83 100644 (file)
@@ -40,20 +40,21 @@ string _net_prevmsgstr;
 #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); }
+
+REGISTRY_DEFINE_GET(TempEntities, NULL)
+STATIC_INIT(TempEntities_renumber) { FOREACH(TempEntities, true, it.m_id = 80 + i); }
 
 
 
 #ifdef CSQC
        #define REGISTER_NET_LINKED(id) \
-               [[accumulate]] NET_HANDLE(id, bool isnew) \
+               ACCUMULATE NET_HANDLE(id, bool isnew) \
                { \
                        this = __self; \
-                       this.sourceLoc = __FILE__ ":" STR(__LINE__); \
+                       this.sourceLoc = __FILE__":"STR(__LINE__); \
                        if (!this) isnew = true; \
                } \
                NET_GUARD(id); \
@@ -72,11 +73,12 @@ STATIC_INIT(RegisterTempEntities_renumber) { FOREACH(TempEntities, true, it.m_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); }
+
+REGISTRY_DEFINE_GET(LinkedEntities, NULL)
+STATIC_INIT(LinkedEntities_renumber) { FOREACH(LinkedEntities, true, it.m_id = 1 + i); }
 
 
 
@@ -98,16 +100,16 @@ STATIC_INIT(RegisterLinkedEntities_renumber) { FOREACH(LinkedEntities, true, it.
 #endif
 
 REGISTRY(C2S_Protocol, BITS(8) - 1)
-#define C2S_Protocol_from(i) _C2S_Protocol_from(i, NULL)
 REGISTER_REGISTRY(C2S_Protocol)
 REGISTRY_SORT(C2S_Protocol)
 REGISTRY_CHECK(C2S_Protocol)
+
+REGISTRY_DEFINE_GET(C2S_Protocol, NULL)
 STATIC_INIT(C2S_Protocol_renumber) { FOREACH(C2S_Protocol, true, it.m_id = i); }
 
 #ifdef SVQC
        const int MSG_ENTITY = 5;
 
-       .int Version;  // deprecated, use SendFlags
        .int SendFlags;
 
        IntrusiveList g_uncustomizables;
@@ -171,7 +173,7 @@ STATIC_INIT(C2S_Protocol_renumber) { FOREACH(C2S_Protocol, true, it.m_id = i); }
                STRING_ITERATOR_SET(g_buf, buf, 0);
                for (int C2S; (C2S = ReadByte()) >= 0; )
                {
-                       entity reader = C2S_Protocol_from(C2S);
+                       entity reader = REGISTRY_GET(C2S_Protocol, C2S);
                        if (reader && reader.m_read && reader.m_read(NULL, sender, true)) continue;
                        LOG_SEVEREF("Net_ClientCommand() with malformed C2S=%d", C2S);
                        return;
@@ -188,13 +190,13 @@ STATIC_INIT(C2S_Protocol_renumber) { FOREACH(C2S_Protocol, true, it.m_id = i); }
        const int MSG_C2S = 0;
 
        #define Net_Accept(classname) \
-               MACRO_BEGIN \
-                       if (!this)    this = new(classname); \
-               MACRO_END
+               MACRO_BEGIN \
+                       if (!this) this = new(classname); \
+               MACRO_END
        #define Net_Reject() \
-               MACRO_BEGIN \
-                       if (this)     delete(this); \
-               MACRO_END
+               MACRO_BEGIN \
+                       if (this) delete(this); \
+               MACRO_END
 
        string g_buf;
 
@@ -202,23 +204,20 @@ STATIC_INIT(C2S_Protocol_renumber) { FOREACH(C2S_Protocol, true, it.m_id = i); }
        {
                if (g_buf == "") return;
                localcmd("\ncmd c2s \"", strreplace("$", "$$", g_buf), "\"\n");
-               strunzone(g_buf);
-               g_buf = string_null;
+               strfree(g_buf);
        }
 #endif
 
 #if defined(CSQC)
        #define WriteHeader(to, id) \
-               MACRO_BEGIN { \
-                       WriteByte(to, NET_##id.m_id); \
-               } MACRO_END
+               WriteByte(to, NET_##id.m_id)
 #elif defined(SVQC)
        #define WriteHeader(to, id) \
-               MACRO_BEGIN \
+               MACRO_BEGIN \
                        if (NET_##id##_istemp) WriteByte(to, SVC_TEMPENTITY); \
                        WriteByte(to, NET_##id.m_id); \
                        bool _net_valid = false; serialize_marker(to, _net_valid); \
-               MACRO_END
+               MACRO_END
 #endif
 
 // serialization: new style
@@ -287,7 +286,7 @@ MACRO_END
 
 // serialization: old
 
-#define ReadRegistered(r) r##_from(Read_byte())
+#define ReadRegistered(r) REGISTRY_GET(r, Read_byte())
 #define WriteRegistered(r, to, it) Write_byte(to, it.m_id)
 
 #define Read_byte() ReadByte()
@@ -301,8 +300,12 @@ MACRO_END
                string s = string_null;
                yenc_single(b, s);
                string tmp = strcat(g_buf, s);
-               if (g_buf) strunzone(g_buf);
-               g_buf = strzone(tmp);
+               strcpy(g_buf, tmp);
+       }
+       void WriteShort(int to, int b)
+       {
+               WriteByte(to, (b >> 8) & 0xFF);
+               WriteByte(to, b & 0xFF);
        }
 #elif defined(SVQC)
        int ReadByte()
@@ -311,6 +314,10 @@ MACRO_END
                ydec_single(g_buf, ret);
                return ret;
        }
+       int ReadShort()
+       {
+               return (ReadByte() << 8) | (ReadByte());
+       }
        void WriteByte(int to, int b);
 #endif
 
@@ -350,6 +357,15 @@ MACRO_END
                #define ReadFloat() ReadCoord()
                #define ReadVector() vec3(ReadFloat(), ReadFloat(), ReadFloat())
                #define ReadVector2D() vec2(ReadFloat(), ReadFloat())
+               #define ReadAngleVector() vec3(ReadAngle(), ReadAngle(), ReadAngle())
+               #define ReadAngleVector2D() vec2(ReadAngle(), ReadAngle())
+
+               int Readbits(int num)
+               {
+                       if (num > 16) return ReadInt24_t();
+                       if (num > 8) return ReadShort();
+                       return ReadByte();
+               }
 
                float ReadApproxPastTime()
                {
@@ -380,9 +396,18 @@ MACRO_END
                        WriteInt24_t(dst, val.z);
                }
 
-        #define WriteFloat(to, f) WriteCoord(to, f)
-               #define WriteVector(to, v) MACRO_BEGIN { WriteFloat(to, v.x); WriteFloat(to, v.y); WriteFloat(to, v.z); } MACRO_END
-        #define WriteVector2D(to, v) MACRO_BEGIN { WriteFloat(to, v.x); WriteFloat(to, v.y); } MACRO_END
+               #define WriteFloat(to, f) WriteCoord(to, f)
+               #define WriteVector(to, v) MACRO_BEGIN WriteFloat(to, v.x); WriteFloat(to, v.y); WriteFloat(to, v.z); MACRO_END
+               #define WriteVector2D(to, v) MACRO_BEGIN WriteFloat(to, v.x); WriteFloat(to, v.y); MACRO_END
+               #define WriteAngleVector(to, v) MACRO_BEGIN WriteAngle(to, v.x); WriteAngle(to, v.y); WriteAngle(to, v.z); MACRO_END
+               #define WriteAngleVector2D(to, v) MACRO_BEGIN WriteAngle(to, v.x); WriteAngle(to, v.y); MACRO_END
+
+               void Writebits(float dst, float val, int num)
+               {
+                       if (num > 16) { WriteInt24_t(dst, val); return; }
+                       if (num > 8) { WriteShort(dst, val); return; }
+                       WriteByte(dst, val);
+               }
 
                // this will use the value:
                //   128
@@ -407,7 +432,7 @@ MACRO_END
                }
 
                // allow writing to also pass through to spectators (like so spectators see the same centerprints as players for example)
-               #define WRITESPECTATABLE_MSG_ONE(to, statement) MACRO_BEGIN \
+               #define WRITESPECTATABLE_MSG_ONE(to, statement) MACRO_BEGIN \
                        entity prev = msg_entity; \
                        entity dst = to; \
                        FOREACH_CLIENT(IS_REAL_CLIENT(it), { \
@@ -418,6 +443,6 @@ MACRO_END
                                } \
                        }); \
                        msg_entity = prev; \
-               MACRO_END
+               MACRO_END
        #endif
 #endif