]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/csqcmodel/sv_model.qc
csqcmodels: support effects properly
[xonotic/xonotic-data.pk3dir.git] / qcsrc / csqcmodel / sv_model.qc
index b6952f02772905acb190dd1fdd3e823968263de5..1c214e0aba78780aabf153c2437966ca0c20b848 100644 (file)
 
 // generic CSQC model code
 
-#define CSQCMODEL_PROPERTY(flag,r,w,f) \
-       .float csqcmodel_##f;
-#define CSQCMODEL_PROPERTY_SCALED(flag,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,r,w,f)
-       ALLPROPERTIES
-#undef CSQCMODEL_PROPERTY_SCALED
-#undef CSQCMODEL_PROPERTY
-
 float CSQCModel_Send(entity to, float sf)
 {
+       // some nice flags for CSQCMODEL_IF
+       float isplayer = (self.flags & FL_CLIENT);
+       float islocalplayer = (self == to);
+       float isnolocalplayer = (isplayer && (self != to));
+
        WriteByte(MSG_ENTITY, ENT_CLIENT_MODEL);
        WriteShort(MSG_ENTITY, sf);
 
-#define CSQCMODEL_PROPERTY(flag,r,w,f) \
+#define CSQCMODEL_IF(cond) if(cond) {
+#define CSQCMODEL_ENDIF }
+#define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
        if(sf & flag) \
        { \
                w(MSG_ENTITY, self.csqcmodel_##f); \
        }
-#define CSQCMODEL_PROPERTY_SCALED(flag,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,r,w,f)
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) CSQCMODEL_PROPERTY(flag,t,r,w,f)
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
 
        return TRUE;
 }
 
+#ifdef CSQCPLAYER_FORCE_UPDATES
+.float csqcmodel_nextforcedupdate;
+#endif
 void CSQCModel_CheckUpdate()
 {
-       float tmp;
+       // some nice flags for CSQCMODEL_IF
+       float isplayer = (self.flags & FL_CLIENT);
+       float islocalplayer = isplayer; // we set BOTH to 1 here as we need the sendflags
+       float isnolocalplayer = isplayer; // we set BOTH to 1 here as we need the sendflags
+
+#ifdef CSQCPLAYER_FORCE_UPDATES
+       if(isplayer && time > self.csqcmodel_nextforcedupdate)
+       {
+               self.SendFlags |= CSQCMODEL_PROPERTY_ORIGIN;
+               self.csqcmodel_nextforcedupdate = time + CSQCPLAYER_FORCE_UPDATES * (0.5 + random()); // ensure about 4 origin sends per sec
+       }
+#endif
 
        if(self.effects & EF_RESTARTANIM_BIT)
        {
@@ -63,23 +79,31 @@ void CSQCModel_CheckUpdate()
                self.effects &~= EF_TELEPORT_BIT;
        }
 
-#define CSQCMODEL_PROPERTY(flag,r,w,f) \
-       tmp = self.f; \
-       if(tmp != self.csqcmodel_##f) \
+#define CSQCMODEL_IF(cond) if(cond) {
+#define CSQCMODEL_ENDIF }
+#define CSQCMODEL_PROPERTY(flag,t,r,w,f) \
        { \
-               self.csqcmodel_##f = tmp; \
-               self.SendFlags |= flag; \
+               t tmp = self.f; \
+               if(tmp != self.csqcmodel_##f) \
+               { \
+                       self.csqcmodel_##f = tmp; \
+                       self.SendFlags |= flag; \
+               } \
        }
-#define CSQCMODEL_PROPERTY_SCALED(flag,r,w,f,s,mi,ma) \
-       tmp = bound(mi, s * self.f, ma); \
-       if(tmp != self.csqcmodel_##f) \
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
        { \
-               self.csqcmodel_##f = tmp; \
-               self.SendFlags |= flag; \
+               t tmp = bound(mi, s * self.f, ma); \
+               if(tmp != self.csqcmodel_##f) \
+               { \
+                       self.csqcmodel_##f = tmp; \
+                       self.SendFlags |= flag; \
+               } \
        }
        ALLPROPERTIES
 #undef CSQCMODEL_PROPERTY_SCALED
 #undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
 }
 
 void CSQCModel_LinkEntity()