]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_main.c
added .float sendcomplexanimation server qc field which if TRUE will
[xonotic/darkplaces.git] / sv_main.c
index a73bb657e0ab3c4974241b0b704bd0623eca1f73..7751d817c7002976f85648de87e36f6ce00366ef 100644 (file)
--- a/sv_main.c
+++ b/sv_main.c
@@ -311,6 +311,18 @@ prvm_required_field_t reqfields[] =
        {ev_vector, "glowmod"},
        {ev_vector, "movement"},
        {ev_vector, "punchvector"},
+       {ev_float, "frame"},
+       {ev_float, "frame1time"},
+       {ev_float, "frame2"},
+       {ev_float, "frame2time"},
+       {ev_float, "frame3"},
+       {ev_float, "frame3time"},
+       {ev_float, "frame4"},
+       {ev_float, "frame4time"},
+       {ev_float, "lerpfrac"},
+       {ev_float, "lerpfrac3"},
+       {ev_float, "lerpfrac4"},
+       {ev_float, "sendcomplexanimation"},
 
        // physics
        //{ev_float, "solid"},
@@ -487,29 +499,26 @@ void SV_Init (void)
        Cvar_RegisterVariable (&temp1);
 
        // LordHavoc: Nehahra uses these to pass data around cutscene demos
-       if (gamemode == GAME_NEHAHRA)
-       {
-               Cvar_RegisterVariable (&nehx00);
-               Cvar_RegisterVariable (&nehx01);
-               Cvar_RegisterVariable (&nehx02);
-               Cvar_RegisterVariable (&nehx03);
-               Cvar_RegisterVariable (&nehx04);
-               Cvar_RegisterVariable (&nehx05);
-               Cvar_RegisterVariable (&nehx06);
-               Cvar_RegisterVariable (&nehx07);
-               Cvar_RegisterVariable (&nehx08);
-               Cvar_RegisterVariable (&nehx09);
-               Cvar_RegisterVariable (&nehx10);
-               Cvar_RegisterVariable (&nehx11);
-               Cvar_RegisterVariable (&nehx12);
-               Cvar_RegisterVariable (&nehx13);
-               Cvar_RegisterVariable (&nehx14);
-               Cvar_RegisterVariable (&nehx15);
-               Cvar_RegisterVariable (&nehx16);
-               Cvar_RegisterVariable (&nehx17);
-               Cvar_RegisterVariable (&nehx18);
-               Cvar_RegisterVariable (&nehx19);
-       }
+       Cvar_RegisterVariable (&nehx00);
+       Cvar_RegisterVariable (&nehx01);
+       Cvar_RegisterVariable (&nehx02);
+       Cvar_RegisterVariable (&nehx03);
+       Cvar_RegisterVariable (&nehx04);
+       Cvar_RegisterVariable (&nehx05);
+       Cvar_RegisterVariable (&nehx06);
+       Cvar_RegisterVariable (&nehx07);
+       Cvar_RegisterVariable (&nehx08);
+       Cvar_RegisterVariable (&nehx09);
+       Cvar_RegisterVariable (&nehx10);
+       Cvar_RegisterVariable (&nehx11);
+       Cvar_RegisterVariable (&nehx12);
+       Cvar_RegisterVariable (&nehx13);
+       Cvar_RegisterVariable (&nehx14);
+       Cvar_RegisterVariable (&nehx15);
+       Cvar_RegisterVariable (&nehx16);
+       Cvar_RegisterVariable (&nehx17);
+       Cvar_RegisterVariable (&nehx18);
+       Cvar_RegisterVariable (&nehx19);
        Cvar_RegisterVariable (&cutscene); // for Nehahra but useful to other mods as well
 
        Cvar_RegisterVariable (&sv_autodemo_perclient);
@@ -518,34 +527,6 @@ void SV_Init (void)
 
        Cvar_RegisterVariable (&halflifebsp);
 
-       // any special defaults for gamemodes go here
-       if (gamemode == GAME_NEHAHRA)
-       {
-               // Nehahra pushable crates malfunction in some levels if this is on
-               Cvar_SetValueQuick (&sv_gameplayfix_upwardvelocityclearsongroundflag, 0);
-               // Nehahra NPC AI is confused by this feature
-               Cvar_SetValueQuick (&sv_gameplayfix_blowupfallenzombies, 0);
-       }
-       if (gamemode == GAME_HIPNOTIC)
-       {
-               // hipnotic mission pack has issues in their 'friendly monster' ai, which seem to attempt to attack themselves for some reason when findradius() returns non-solid entities.
-               Cvar_SetValueQuick (&sv_gameplayfix_blowupfallenzombies, 0);
-               // hipnotic mission pack has issues with bobbing water entities 'jittering' between different heights on alternate frames at the default 0.0138889 ticrate, 0.02 avoids this issue
-               Cvar_SetValueQuick (&sys_ticrate, 0.02);
-               // hipnotic mission pack has issues in their proximity mine sticking code, which causes them to bounce off.
-               Cvar_SetValueQuick (&sv_gameplayfix_slidemoveprojectiles, 0);
-       }
-       if (gamemode == GAME_ROGUE)
-       {
-               // rogue mission pack has a guardian boss that does not wake up if findradius returns one of the entities around its spawn area
-               Cvar_SetValueQuick (&sv_gameplayfix_findradiusdistancetobox, 0);
-       }
-       if (gamemode == GAME_NEXUIZ)
-       {
-               Cvar_SetValueQuick (&sv_gameplayfix_q2airaccelerate, 1);
-               Cvar_SetValueQuick (&sv_gameplayfix_stepmultipletimes, 1);
-       }
-
        sv_mempool = Mem_AllocPool("server", 0, NULL);
 }
 
@@ -1260,6 +1241,25 @@ static qboolean SV_PrepareEntityForSending (prvm_edict_t *ent, entity_state_t *c
        if (cs->viewmodelforclient)
                cs->flags |= RENDER_VIEWMODEL; // show relative to the view
 
+       if (PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.sendcomplexanimation)->_float)
+       {
+               cs->flags |= RENDER_COMPLEXANIMATION;
+               if (PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.skeletonindex)->_float >= 1)
+                       cs->skeletonobject = ent->priv.server->skeleton;
+               cs->framegroupblend[0].frame = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame)->_float;
+               cs->framegroupblend[1].frame = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame2)->_float;
+               cs->framegroupblend[2].frame = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame3)->_float;
+               cs->framegroupblend[3].frame = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame4)->_float;
+               cs->framegroupblend[0].start = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame1time)->_float;
+               cs->framegroupblend[1].start = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame2time)->_float;
+               cs->framegroupblend[2].start = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame3time)->_float;
+               cs->framegroupblend[3].start = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.frame4time)->_float;
+               cs->framegroupblend[1].lerp = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.lerpfrac)->_float;
+               cs->framegroupblend[2].lerp = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.lerpfrac3)->_float;
+               cs->framegroupblend[3].lerp = PRVM_EDICTFIELDVALUE(ent, prog->fieldoffsets.lerpfrac4)->_float;
+               cs->framegroupblend[0].lerp = 1.0f - cs->framegroupblend[1].lerp - cs->framegroupblend[2].lerp - cs->framegroupblend[3].lerp;
+       }
+
        cs->light[0] = light[0];
        cs->light[1] = light[1];
        cs->light[2] = light[2];
@@ -3139,6 +3139,8 @@ void SV_SpawnServer (const char *server)
                return;
        }
 
+       Collision_Cache_Reset(true);
+
        // let's not have any servers with no name
        if (hostname.string[0] == 0)
                Cvar_Set ("hostname", "UNNAMED");