]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_edict.c
changed COM_ParseToken_Simple to have a parsebackslash option, usually
[xonotic/darkplaces.git] / prvm_edict.c
index 102a40c73a304c9a9fc91bb30c25fe2bbe79a418..fd6b1d0318faa4fddbb818925f897dd6a63bc2e9 100644 (file)
@@ -872,7 +872,7 @@ void PRVM_ED_ParseGlobals (const char *data)
        while (1)
        {
                // parse key
-               if (!COM_ParseToken_Simple(&data, false))
+               if (!COM_ParseToken_Simple(&data, false, false))
                        PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace");
                if (com_token[0] == '}')
                        break;
@@ -880,7 +880,7 @@ void PRVM_ED_ParseGlobals (const char *data)
                strlcpy (keyname, com_token, sizeof(keyname));
 
                // parse value
-               if (!COM_ParseToken_Simple(&data, false))
+               if (!COM_ParseToken_Simple(&data, false, true))
                        PRVM_ERROR ("PRVM_ED_ParseGlobals: EOF without closing brace");
 
                if (com_token[0] == '}')
@@ -1129,7 +1129,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent)
        while (1)
        {
        // parse key
-               if (!COM_ParseToken_Simple(&data, false))
+               if (!COM_ParseToken_Simple(&data, false, false))
                        PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace");
                if (developer_entityparsing.integer)
                        Con_Printf("Key: \"%s\"", com_token);
@@ -1161,7 +1161,7 @@ const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent)
                }
 
        // parse value
-               if (!COM_ParseToken_Simple(&data, false))
+               if (!COM_ParseToken_Simple(&data, false, true))
                        PRVM_ERROR ("PRVM_ED_ParseEdict: EOF without closing brace");
                if (developer_entityparsing.integer)
                        Con_Printf(" \"%s\"\n", com_token);
@@ -1236,7 +1236,7 @@ void PRVM_ED_LoadFromFile (const char *data)
        while (1)
        {
 // parse the opening brace
-               if (!COM_ParseToken_Simple(&data, false))
+               if (!COM_ParseToken_Simple(&data, false, false))
                        break;
                if (com_token[0] != '{')
                        PRVM_ERROR ("PRVM_ED_LoadFromFile: %s: found %s when expecting {", PRVM_NAME, com_token);
@@ -1284,18 +1284,30 @@ void PRVM_ED_LoadFromFile (const char *data)
 
                        if (!func)
                        {
-                               if (developer.integer) // don't confuse non-developers with errors
+                               // check for OnEntityNoSpawnFunction
+                               if (prog->funcoffsets.SV_OnEntityNoSpawnFunction)
                                {
-                                       Con_Print("No spawn function for:\n");
-                                       PRVM_ED_Print(ent, NULL);
+                                       // self = ent
+                                       PRVM_GLOBALFIELDVALUE(prog->globaloffsets.self)->edict = PRVM_EDICT_TO_PROG(ent);
+                                       PRVM_ExecuteProgram (prog->funcoffsets.SV_OnEntityNoSpawnFunction, "QC function SV_OnEntityNoSpawnFunction is missing");
+                               }
+                               else
+                               {
+                                       if (developer.integer) // don't confuse non-developers with errors
+                                       {
+                                               Con_Print("No spawn function for:\n");
+                                               PRVM_ED_Print(ent, NULL);
+                                       }
+                                       PRVM_ED_Free (ent);
+                                       continue;
                                }
-                               PRVM_ED_Free (ent);
-                               continue;
                        }
-
-                       // self = ent
-                       PRVM_GLOBALFIELDVALUE(prog->globaloffsets.self)->edict = PRVM_EDICT_TO_PROG(ent);
-                       PRVM_ExecuteProgram (func - prog->functions, "");
+                       else
+                       {
+                               // self = ent
+                               PRVM_GLOBALFIELDVALUE(prog->globaloffsets.self)->edict = PRVM_EDICT_TO_PROG(ent);
+                               PRVM_ExecuteProgram (func - prog->functions, "");
+                       }
                }
 
                spawned++;
@@ -1406,6 +1418,7 @@ void PRVM_FindOffsets(void)
        prog->funcoffsets.CSQC_Ent_Remove                 = PRVM_ED_FindFunctionOffset("CSQC_Ent_Remove");
        prog->funcoffsets.CSQC_Ent_Update                 = PRVM_ED_FindFunctionOffset("CSQC_Ent_Update");
        prog->funcoffsets.CSQC_Event                      = PRVM_ED_FindFunctionOffset("CSQC_Event");
+       prog->funcoffsets.CSQC_Event_Sound                = PRVM_ED_FindFunctionOffset("CSQC_Event_Sound");
        prog->funcoffsets.CSQC_Init                       = PRVM_ED_FindFunctionOffset("CSQC_Init");
        prog->funcoffsets.CSQC_InputEvent                 = PRVM_ED_FindFunctionOffset("CSQC_InputEvent");
        prog->funcoffsets.CSQC_Parse_CenterPrint          = PRVM_ED_FindFunctionOffset("CSQC_Parse_CenterPrint");
@@ -1419,6 +1432,7 @@ void PRVM_FindOffsets(void)
        prog->funcoffsets.SV_ChangeTeam                   = PRVM_ED_FindFunctionOffset("SV_ChangeTeam");
        prog->funcoffsets.SV_ParseClientCommand           = PRVM_ED_FindFunctionOffset("SV_ParseClientCommand");
        prog->funcoffsets.SV_PlayerPhysics                = PRVM_ED_FindFunctionOffset("SV_PlayerPhysics");
+       prog->funcoffsets.SV_OnEntityNoSpawnFunction      = PRVM_ED_FindFunctionOffset("SV_OnEntityNoSpawnFunction");
        prog->funcoffsets.GameCommand                     = PRVM_ED_FindFunctionOffset("GameCommand");
        prog->globaloffsets.SV_InitCmd                    = PRVM_ED_FindGlobalOffset("SV_InitCmd");
        prog->globaloffsets.self                          = PRVM_ED_FindGlobalOffset("self");
@@ -1446,6 +1460,7 @@ void PRVM_FindOffsets(void)
        prog->globaloffsets.dmg_take                      = PRVM_ED_FindGlobalOffset("dmg_take");
        prog->globaloffsets.dmg_save                      = PRVM_ED_FindGlobalOffset("dmg_save");
        prog->globaloffsets.dmg_origin                    = PRVM_ED_FindGlobalOffset("dmg_origin");
+       prog->globaloffsets.sb_showscores                 = PRVM_ED_FindGlobalOffset("sb_showscores");
 
        // menu qc only uses some functions, nothing else
        prog->funcoffsets.m_display                       = PRVM_ED_FindFunctionOffset("m_display");
@@ -1571,14 +1586,11 @@ void PRVM_LoadProgs (const char * filename, int numrequiredfunc, char **required
        //prog->functions = (dfunction_t *)((unsigned char *)progs + progs->ofs_functions);
        dfunctions = (dfunction_t *)((unsigned char *)prog->progs + prog->progs->ofs_functions);
 
+       if (prog->progs->ofs_strings + prog->progs->numstrings >= (int)filesize)
+               PRVM_ERROR ("%s: %s strings go past end of file", PRVM_NAME, filename);
        prog->strings = (char *)prog->progs + prog->progs->ofs_strings;
-       prog->stringssize = 0;
-       for (i = 0;i < prog->progs->numstrings;i++)
-       {
-               if (prog->progs->ofs_strings + prog->stringssize >= (int)filesize)
-                       PRVM_ERROR ("%s: %s strings go past end of file", PRVM_NAME, filename);
-               prog->stringssize += (int)strlen (prog->strings + prog->stringssize) + 1;
-       }
+       prog->stringssize = prog->progs->numstrings;
+
        prog->numknownstrings = 0;
        prog->maxknownstrings = 0;
        prog->knownstrings = NULL;