-#include "csqcmodel_hooks.qh"
-#include "_all.qh"
-
-#include "gibs.qh"
+#include "mutators/events.qh"
#include "player_skeleton.qh"
-
#include "weapons/projectile.qh"
-
#include "../common/animdecide.qh"
-#include "../common/csqcmodel_settings.qh"
-#include "../common/teams.qh"
-#include "../common/triggers/trigger/viewloc.qh"
-
-#include "mutators/events.qh"
-
-#include "../csqcmodellib/cl_model.qh"
-#include "../csqcmodellib/cl_player.qh"
-#include "../csqcmodellib/interpolate.qh"
-
+#include "../common/movetypes/movetypes.qh"
+#include "../common/viewloc.qh"
+#include "../lib/csqcmodel/cl_model.qh"
+#include "../lib/csqcmodel/cl_player.qh"
+#include "../lib/csqcmodel/interpolate.qh"
.float death_time;
.int modelflags;
.int lodmodelindex0;
.int lodmodelindex1;
.int lodmodelindex2;
-void CSQCPlayer_LOD_Apply(void)
-{
+void CSQCPlayer_LOD_Apply()
+{SELFPARAM();
// LOD model loading
if(self.lodmodelindex0 != self.modelindex)
{
if(fexists(s))
{
precache_model(s);
- setmodel(self, s);
+ _setmodel(self, s);
if(self.modelindex)
self.lodmodelindex1 = self.modelindex;
}
if(fexists(s))
{
precache_model(s);
- setmodel(self, s);
+ _setmodel(self, s);
if(self.modelindex)
self.lodmodelindex2 = self.modelindex;
}
- setmodel(self, modelname); // make everything normal again
+ _setmodel(self, modelname); // make everything normal again
setsize(self, mi, ma);
}
.vector glowmod;
.vector old_glowmod;
-void CSQCPlayer_ModelAppearance_PreUpdate(void)
-{
+void CSQCPlayer_ModelAppearance_PreUpdate()
+{SELFPARAM();
self.model = self.forceplayermodels_savemodel;
self.modelindex = self.forceplayermodels_savemodelindex;
self.skin = self.forceplayermodels_saveskin;
self.colormap = self.forceplayermodels_savecolormap;
}
-void CSQCPlayer_ModelAppearance_PostUpdate(void)
-{
+void CSQCPlayer_ModelAppearance_PostUpdate()
+{SELFPARAM();
self.forceplayermodels_savemodel = self.model;
self.forceplayermodels_savemodelindex = self.modelindex;
self.forceplayermodels_saveskin = self.skin;
}
}
void CSQCPlayer_ModelAppearance_Apply(bool islocalplayer)
-{
+{SELFPARAM();
// FORCEMODEL
// which one is ALWAYS good?
if (!forceplayermodels_goodmodel)
{
- entity e;
- e = spawn();
+ entity e = spawn();
precache_model(cvar_defstring("_cl_playermodel"));
- setmodel(e, cvar_defstring("_cl_playermodel"));
+ _setmodel(e, cvar_defstring("_cl_playermodel"));
forceplayermodels_goodmodel = e.model;
forceplayermodels_goodmodelindex = e.modelindex;
remove(e);
forceplayermodels_attempted = 1;
// only if this failed, find it out on our own
- entity e;
- e = spawn();
- setmodel(e, autocvar__cl_playermodel); // this is harmless, see below
+ entity e = spawn();
+ _setmodel(e, autocvar__cl_playermodel); // this is harmless, see below
forceplayermodels_modelisgoodmodel = fexists(e.model);
forceplayermodels_model = e.model;
forceplayermodels_modelindex = e.modelindex;
if(autocvar_cl_forcemyplayermodel != "" && autocvar_cl_forcemyplayermodel != forceplayermodels_mymodel)
{
- entity e;
- e = spawn();
- setmodel(e, autocvar_cl_forcemyplayermodel); // this is harmless, see below
+ entity e = spawn();
+ _setmodel(e, autocvar_cl_forcemyplayermodel); // this is harmless, see below
forceplayermodels_myisgoodmodel = fexists(e.model);
forceplayermodels_mymodel = e.model;
forceplayermodels_mymodelindex = e.modelindex;
.int csqcmodel_framecount;
#define IS_DEAD_FRAME(f) ((f) == 0 || (f) == 1)
-void CSQCPlayer_FallbackFrame_PreUpdate(void)
-{
+void CSQCPlayer_FallbackFrame_PreUpdate()
+{SELFPARAM();
self.frame = self.csqcmodel_saveframe;
self.frame2 = self.csqcmodel_saveframe2;
#ifdef CSQCMODEL_HAVE_TWO_FRAMES
#endif
}
void CSQCPlayer_FallbackFrame_PostUpdate(bool isnew)
-{
+{SELFPARAM();
self.csqcmodel_saveframe = self.frame;
self.csqcmodel_saveframe2 = self.frame2;
#ifdef CSQCMODEL_HAVE_TWO_FRAMES
self.csqcmodel_isdead = IS_DEAD_FRAME(self.frame);
}
void CSQCPlayer_AnimDecide_PostUpdate(bool isnew)
-{
+{SELFPARAM();
self.csqcmodel_isdead = !!(self.anim_state & (ANIMSTATE_DEAD1 | ANIMSTATE_DEAD2));
}
int CSQCPlayer_FallbackFrame(int f)
-{
+{SELFPARAM();
if(frameduration(self.modelindex, f) > 0)
return f; // goooooood
if(frameduration(self.modelindex, 1) <= 0)
LOG_INFOF("Frame %d missing in model %s, and we have no fallback - FAIL!\n", f, self.model);
return f;
}
-void CSQCPlayer_FallbackFrame_Apply(void)
-{
+void CSQCPlayer_FallbackFrame_Apply()
+{SELFPARAM();
self.frame = CSQCPlayer_FallbackFrame(self.frame);
self.frame2 = CSQCPlayer_FallbackFrame(self.frame2);
#ifdef CSQCMODEL_HAVE_TWO_FRAMES
.entity tag_entity;
.int tag_entity_lastmodelindex;
.int tag_index;
-void CSQCModel_AutoTagIndex_Apply(void)
-{
+void CSQCModel_AutoTagIndex_Apply()
+{SELFPARAM();
if(self.tag_entity && wasfreed(self.tag_entity))
self.tag_entity = world;
- if(self.viewloc && wasfreed(self.viewloc))
- self.viewloc = world;
-
- if(self.viewloc.entnum != self.tag_networkviewloc)
- self.viewloc = findfloat(world, entnum, self.tag_networkviewloc);
+ viewloc_SetTags();
MUTATOR_CALLHOOK(TagIndex_Update, self);
// recursive predraw call to fix issues with forcemodels and LOD if bone indexes mismatch
if(self.tag_entity.classname == "csqcmodel")
{
- entity oldself = self;
- self = self.tag_entity;
- CSQCModel_Hook_PreDraw((self.entnum >= 1 && self.entnum <= maxclients));
- self = oldself;
+ WITH(entity, self, self.tag_entity, CSQCModel_Hook_PreDraw((self.entnum >= 1 && self.entnum <= maxclients)));
}
if(self.tag_entity.modelindex != self.tag_entity_lastmodelindex)
}
// FEATURE: EF_NODRAW workalike
-const int EF_BRIGHTFIELD = 1;
-const int EF_BRIGHTLIGHT = 4;
-const int EF_DIMLIGHT = 8;
-const int EF_DOUBLESIDED = 32768;
-const int EF_NOSELFSHADOW = 65536;
-const int EF_DYNAMICMODELLIGHT = 131072;
-const int EF_RESTARTANIM_BIT = 1048576;
-const int EF_TELEPORT_BIT = 2097152;
-const int MF_ROCKET = 1; // leave a trail
-const int MF_GRENADE = 2; // leave a trail
-const int MF_GIB = 4; // leave a trail
-const int MF_ROTATE = 8; // rotate (bonus items)
-const int MF_TRACER = 16; // green split trail
-const int MF_ZOMGIB = 32; // small blood trail
-const int MF_TRACER2 = 64; // orange split trail
-const int MF_TRACER3 = 128; // purple trail
+const int EF_BRIGHTFIELD = BIT(0);
+const int EF_BRIGHTLIGHT = BIT(2);
+const int EF_DIMLIGHT = BIT(3);
+const int EF_DOUBLESIDED = BIT(15);
+const int EF_NOSELFSHADOW = BIT(16);
+const int EF_DYNAMICMODELLIGHT = BIT(17);
+const int EF_RESTARTANIM_BIT = BIT(20);
+const int EF_TELEPORT_BIT = BIT(21);
+const int MF_ROCKET = BIT(0); // leave a trail
+const int MF_GRENADE = BIT(1); // leave a trail
+const int MF_GIB = BIT(2); // leave a trail
+const int MF_ROTATE = BIT(3); // rotate (bonus items)
+const int MF_TRACER = BIT(4); // green split trail
+const int MF_ZOMGIB = BIT(5); // small blood trail
+const int MF_TRACER2 = BIT(6); // orange split trail
+const int MF_TRACER3 = BIT(7); // purple trail
.int csqcmodel_effects;
.int csqcmodel_modelflags;
-void CSQCModel_Effects_PreUpdate(void)
-{
+.int csqcmodel_traileffect;
+void CSQCModel_Effects_PreUpdate()
+{SELFPARAM();
self.effects = self.csqcmodel_effects;
self.modelflags = self.csqcmodel_modelflags;
+ self.traileffect = self.csqcmodel_traileffect;
}
-void Reset_ArcBeam(void);
-void CSQCModel_Effects_PostUpdate(void)
-{
+void Reset_ArcBeam();
+void CSQCModel_Effects_PostUpdate()
+{SELFPARAM();
if (self == csqcplayer) {
if (self.csqcmodel_teleported) {
Reset_ArcBeam();
}
self.csqcmodel_effects = self.effects;
self.csqcmodel_modelflags = self.modelflags;
+ self.csqcmodel_traileffect = self.traileffect;
self.effects = 0;
self.modelflags = 0;
if(self.csqcmodel_teleported)
- Projectile_ResetTrail(self.origin);
+ Projectile_ResetTrail(self, self.origin);
}
.int snd_looping;
-void CSQCModel_Effects_Apply(void)
-{
+void CSQCModel_Effects_Apply()
+{SELFPARAM();
int eff = self.csqcmodel_effects & ~CSQCMODEL_EF_RESPAWNGHOST;
+ int tref = self.csqcmodel_traileffect;
self.renderflags &= ~(RF_DEPTHHACK | RF_ADDITIVE | RF_FULLBRIGHT | EF_NOSHADOW | RF_USEAXIS);
self.effects = 0;
self.traileffect = 0;
if(eff & EF_BRIGHTFIELD)
- self.traileffect = particleeffectnum("TR_NEXUIZPLASMA");
+ tref = EFFECT_TR_NEXUIZPLASMA.m_id;
// ignoring EF_MUZZLEFLASH
if(eff & EF_BRIGHTLIGHT)
adddynamiclight(self.origin, 400, '3 3 3');
if(eff & EF_FULLBRIGHT)
self.renderflags |= RF_FULLBRIGHT;
if(eff & EF_FLAME)
- pointparticles(particleeffectnum("EF_FLAME"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+ pointparticles(EFFECT_EF_FLAME, self.origin, '0 0 0', bound(0, frametime, 0.1));
if(eff & EF_STARDUST)
- pointparticles(particleeffectnum("EF_STARDUST"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+ pointparticles(EFFECT_EF_STARDUST, self.origin, '0 0 0', bound(0, frametime, 0.1));
if(eff & EF_NOSHADOW)
self.renderflags |= RF_NOSHADOW;
if(eff & EF_NODEPTHTEST)
self.renderflags |= RF_DYNAMICMODELLIGHT;
// ignoring EF_UNUSED18, EF_UNUSED19, EF_RESTARTANIM_BIT, EF_TELEPORT_BIT, EF_LOWPRECISION
if(self.csqcmodel_modelflags & MF_ROCKET)
- self.traileffect = particleeffectnum("TR_ROCKET");
+ tref = EFFECT_TR_ROCKET.m_id;
if(self.csqcmodel_modelflags & MF_GRENADE)
- self.traileffect = particleeffectnum("TR_GRENADE");
+ tref = EFFECT_TR_GRENADE.m_id;
if(self.csqcmodel_modelflags & MF_GIB)
- self.traileffect = particleeffectnum("TR_BLOOD");
+ tref = EFFECT_TR_BLOOD.m_id;
if(self.csqcmodel_modelflags & MF_ROTATE)
{
self.renderflags |= RF_USEAXIS;
makevectors(self.angles + '0 100 0' * fmod(time, 3.6));
}
if(self.csqcmodel_modelflags & MF_TRACER)
- self.traileffect = particleeffectnum("TR_WIZSPIKE");
+ tref = EFFECT_TR_WIZSPIKE.m_id;
if(self.csqcmodel_modelflags & MF_ZOMGIB)
- self.traileffect = particleeffectnum("TR_SLIGHTBLOOD");
+ tref = EFFECT_TR_SLIGHTBLOOD.m_id;
if(self.csqcmodel_modelflags & MF_TRACER2)
- self.traileffect = particleeffectnum("TR_KNIGHTSPIKE");
+ tref = EFFECT_TR_KNIGHTSPIKE.m_id;
if(self.csqcmodel_modelflags & MF_TRACER3)
- self.traileffect = particleeffectnum("TR_VORESPIKE");
+ tref = EFFECT_TR_VORESPIKE.m_id;
+
+ self.traileffect = tref;
if(self.drawmask)
- Projectile_DrawTrail(self.origin);
+ Projectile_DrawTrail(self, self.origin);
else
- Projectile_ResetTrail(self.origin);
+ Projectile_ResetTrail(self, self.origin);
if(self.csqcmodel_effects & CSQCMODEL_EF_RESPAWNGHOST)
self.renderflags |= RF_ADDITIVE;
{
if(!self.snd_looping)
{
- sound(self, CH_TRIGGER_SINGLE, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+ sound(self, CH_TRIGGER_SINGLE, SND_JETPACK_FLY, VOL_BASE, autocvar_g_jetpack_attenuation);
self.snd_looping = CH_TRIGGER_SINGLE;
}
}
{
if(self.snd_looping)
{
- sound(self, self.snd_looping, "misc/null.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+ sound(self, self.snd_looping, SND_Null, VOL_BASE, autocvar_g_jetpack_attenuation);
self.snd_looping = 0;
}
}
}
-void CSQCPlayer_Precache()
-{
- precache_sound("misc/jetpack_fly.wav");
-}
-
// general functions
.int csqcmodel_predraw_run;
.int anim_frame;
.int anim_saveframe2time;
.int anim_prev_pmove_flags;
void CSQCModel_Hook_PreDraw(bool isplayer)
-{
+{SELFPARAM();
if(self.csqcmodel_predraw_run == framecount)
return;
self.csqcmodel_predraw_run = framecount;
{
CSQCPlayer_ModelAppearance_Apply(self.entnum == player_localnum + 1);
CSQCPlayer_LOD_Apply();
+
if(!isplayer)
{
skeleton_loadinfo(self);
}
void CSQCModel_Hook_PreUpdate(bool isnew, bool isplayer, bool islocalplayer)
-{
+{SELFPARAM();
// interpolate v_angle
self.iflags |= IFLAG_V_ANGLE_X;
// revert to values from server
}
void CSQCModel_Hook_PostUpdate(bool isnew, bool isplayer, bool islocalplayer)
-{
+{SELFPARAM();
// is it a player model? (shared state)
- self.isplayermodel = (substring(self.model, 0, 14) == "models/player/" || substring(self.model, 0, 17) == "models/ok_player/");
+ self.isplayermodel = (substring(self.model, 0, 14) == "models/player/" || substring(self.model, 0, 17) == "models/ok_player/" || (substring(self.model, 0, 16) == "models/monsters/" && (self.entnum >= 1 && self.entnum <= maxclients)));
// save values set by server
if(self.isplayermodel)