.float csqcmodel_lerpfrac2;
.float csqcmodel_lerpfractime;
.float csqcmodel_lerpfrac2time;
-.float csqcmodel_teleported;
void CSQCModel_InterpolateAnimation_PreNote(float sf)
{
void CSQCModel_Draw()
{
+ // some nice flags for CSQCMODEL_IF and the hooks
+ float isplayer = (self.entnum >= 1 && self.entnum <= maxclients);
+ float islocalplayer = (self.entnum == player_localnum + 1);
+ float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1));
+
// we don't do this for the local player as that one is already handled
// by CSQCPlayer_SetCamera()
if(!CSQCPlayer_IsLocalPlayer())
CSQCModel_InterpolateAnimation_Do();
{ CSQCMODEL_HOOK_PREDRAW }
+
+ // inherit draw flags easily
+ entity root = self;
+ while(root.tag_entity)
+ root = root.tag_entity;
+ if(self != root)
+ {
+ self.renderflags &~= RF_EXTERNALMODEL | RF_VIEWMODEL;
+ self.renderflags |= (root.renderflags & (RF_EXTERNALMODEL | RF_VIEWMODEL));
+ }
+
+ // we're drawn, now teleporting is over
+ self.csqcmodel_teleported = 0;
}
void CSQCModel_Read()
float sf;
sf = ReadShort();
+ // some nice flags for CSQCMODEL_IF and the hooks
+ float isplayer = (self.entnum >= 1 && self.entnum <= maxclients);
+ float islocalplayer = (self.entnum == player_localnum + 1);
+ float isnolocalplayer = (isplayer && (self.entnum != player_localnum + 1));
+
self.iflags |= IFLAG_ANGLES; // interpolate angles too
{ CSQCMODEL_HOOK_PREUPDATE }
InterpolateOrigin_Undo();
CSQCModel_InterpolateAnimation_PreNote(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) \
self.f = r();
-#define CSQCMODEL_PROPERTY_SCALED(flag,r,w,f,s,mi,ma) \
+#define CSQCMODEL_PROPERTY_SCALED(flag,t,r,w,f,s,mi,ma) \
if(sf & flag) \
self.f = r() / s;
ALLPROPERTIES
#undef CSQCMODEL_PROPERTY_SCALED
#undef CSQCMODEL_PROPERTY
+#undef CSQCMODEL_ENDIF
+#undef CSQCMODEL_IF
if(sf & CSQCMODEL_PROPERTY_MODELINDEX)
setmodelindex(self, self.modelindex); // this retrieves the .model key and sets mins/maxs/absmin/absmax
// relink
setorigin(self, self.origin);
+ // set obvious render flags
+#ifdef COMPAT_XON050_ENGINE
+ if(self.entnum == player_localentnum || self.entnum == spectatee_status)
+#else
+ if(self.entnum == player_localentnum)
+#endif
+ self.renderflags |= RF_EXTERNALMODEL;
+ else
+ self.renderflags &~= RF_EXTERNALMODEL;
+
// draw it
self.drawmask = MASK_NORMAL;
self.predraw = CSQCModel_Draw;
}
+
+entity CSQCModel_server2csqc(float pl)
+{
+ return findfloat(world, entnum, pl); // FIXME optimize this using an array
+}