#include "csqcmodel_hooks.qh"
-#include "mutators/events.qh"
+#include "autocvars.qh"
+#include "csqcmodel_hooks.qh"
+#include "miscfunctions.qh"
+#include <client/mutators/_mod.qh>
#include "player_skeleton.qh"
#include "weapons/projectile.qh"
#include <common/animdecide.qh>
#include <common/ent_cs.qh>
#include <common/physics/movetypes/movetypes.qh>
#include <common/viewloc.qh>
+#include <common/effects/all.qh>
+#include <common/effects/all.inc>
#include <lib/csqcmodel/cl_model.qh>
#include <lib/csqcmodel/cl_player.qh>
#include <lib/csqcmodel/interpolate.qh>
.float death_time;
.int modelflags;
-void CSQCModel_Hook_PreDraw(entity this, bool isplayer);
-
-.bool isplayermodel;
-
// FEATURE: LOD
.int lodmodelindex0;
.int lodmodelindex1;
this.forceplayermodels_isgoodmodel = fexists(this.forceplayermodels_savemodel);
this.forceplayermodels_isgoodmodel_mdl = this.forceplayermodels_savemodel;
if(!this.forceplayermodels_isgoodmodel)
- LOG_INFOF("Warning: missing model %s has been used\n", this.forceplayermodels_savemodel);
+ LOG_INFOF("Warning: missing model %s has been used", this.forceplayermodels_savemodel);
}
}
void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
{
+ if(MUTATOR_CALLHOOK(ForcePlayermodels_Skip, this, islocalplayer))
+ goto skipforcemodels;
+
// FORCEMODEL
// which one is ALWAYS good?
if (!forceplayermodels_goodmodel)
this.colormap = player_localnum + 1;
}
+ LABEL(skipforcemodels)
+
// GLOWMOD AND DEATH FADING
if(this.colormap > 0)
this.glowmod = colormapPaletteColor(((this.colormap >= 1024) ? this.colormap : entcs_GetClientColors(this.colormap - 1)) & 0x0F, true) * 2;
// player "pops in"
if(isnew)
{
-#define FIX_FRAMETIME(f,ft) MACRO_BEGIN { \
- if(IS_DEAD_FRAME(this.f) && this.ft != 0 && this.death_time != 0) \
- this.ft = this.death_time; \
-} MACRO_END
+#define FIX_FRAMETIME(f,ft) MACRO_BEGIN \
+ if(IS_DEAD_FRAME(this.f) && this.ft != 0 && this.death_time != 0) \
+ this.ft = this.death_time; \
+MACRO_END
FIX_FRAMETIME(frame, frame1time);
FIX_FRAMETIME(frame2, frame2time);
#ifdef CSQCMODEL_HAVE_TWO_FRAMES
}
int CSQCPlayer_FallbackFrame(entity this, int f)
{
- TC(int, f);
+ TC(int, f);
if(frameduration(this.modelindex, f) > 0)
return f; // goooooood
if(frameduration(this.modelindex, 1) <= 0)
// recursive predraw call to fix issues with forcemodels and LOD if bone indexes mismatch
if(this.tag_entity.classname == "csqcmodel")
{
- CSQCModel_Hook_PreDraw(this.tag_entity, (this.tag_entity.entnum >= 1 && this.tag_entity.entnum <= maxclients));
+ CSQCModel_Hook_PreDraw(this.tag_entity, (this.tag_entity.isplayermodel & ISPLAYER_CLIENT));
}
if(this.tag_entity.modelindex != this.tag_entity_lastmodelindex)
LOG_TRACE("h_ model lacks weapon attachment, but v_ model is attached to it");
}
}
- else if(this.tag_entity.isplayermodel)
+ else if((this.tag_entity.isplayermodel & ISPLAYER_MODEL))
{
skeleton_loadinfo(this.tag_entity);
this.tag_index = this.tag_entity.bone_weapon;
if(this.csqcmodel_modelflags & MF_ROTATE)
{
this.renderflags |= RF_USEAXIS;
- makevectors(this.angles + '0 100 0' * fmod(time, 3.6));
+ MAKEVECTORS(makevectors, this.angles + '0 100 0' * fmod(time, 3.6), v_forward, v_right, v_up);
}
if(this.csqcmodel_modelflags & MF_TRACER)
tref = EFFECT_TR_WIZSPIKE.m_id;
{
if(!this.snd_looping)
{
- sound(this, CH_TRIGGER_SINGLE, SND_JETPACK_FLY, VOL_BASE, autocvar_g_jetpack_attenuation);
+ sound(this, CH_TRIGGER_SINGLE, SND_JETPACK_FLY, VOL_BASE, autocvar_cl_jetpack_attenuation);
this.snd_looping = CH_TRIGGER_SINGLE;
}
}
{
if(this.snd_looping)
{
- sound(this, this.snd_looping, SND_Null, VOL_BASE, autocvar_g_jetpack_attenuation);
+ sound(this, this.snd_looping, SND_Null, VOL_BASE, autocvar_cl_jetpack_attenuation);
this.snd_looping = 0;
}
}
return;
this.csqcmodel_predraw_run = framecount;
- if(!this.modelindex || this.model == "null")
+ if(!this.modelindex || this.model == "null" || this.alpha < 0)
{
this.drawmask = 0;
+ if(this.snd_looping > 0)
+ {
+ sound(this, this.snd_looping, SND_Null, VOL_BASE, autocvar_cl_jetpack_attenuation);
+ this.snd_looping = 0;
+ }
return;
}
else
this.drawmask = MASK_NORMAL;
- if(this.isplayermodel) // this checks if it's a player MODEL!
+ if((this.isplayermodel & ISPLAYER_MODEL) && this.drawmask) // this checks if it's a player MODEL!
{
- CSQCPlayer_ModelAppearance_Apply(this, this.entnum == player_localnum + 1);
+ CSQCPlayer_ModelAppearance_Apply(this, (this.isplayermodel & ISPLAYER_LOCAL));
CSQCPlayer_LOD_Apply(this);
if(!isplayer)
this.iflags |= IFLAG_V_ANGLE_X;
// revert to values from server
CSQCModel_Effects_PreUpdate(this);
- if(this.isplayermodel)
+ if((this.isplayermodel & ISPLAYER_MODEL))
{
if(!isplayer)
CSQCPlayer_FallbackFrame_PreUpdate(this);
void CSQCModel_Hook_PostUpdate(entity this, bool isnew, bool isplayer, bool islocalplayer)
{
// is it a player model? (shared state)
- this.isplayermodel = (substring(this.model, 0, 14) == "models/player/" || substring(this.model, 0, 17) == "models/ok_player/" || (substring(this.model, 0, 16) == "models/monsters/" && (this.entnum >= 1 && this.entnum <= maxclients)));
+ bool is_playermodel = (substring(this.model, 0, 14) == "models/player/" || substring(this.model, 0, 17) == "models/ok_player/" ||
+ (substring(this.model, 0, 16) == "models/monsters/" && (this.isplayermodel & BIT(1))));
+ this.isplayermodel = BITSET(this.isplayermodel, ISPLAYER_MODEL, is_playermodel);
// save values set by server
- if(this.isplayermodel)
+ if((this.isplayermodel & ISPLAYER_MODEL))
{
CSQCPlayer_ModelAppearance_PostUpdate(this);
if(isplayer)