X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fcsqcmodel_hooks.qc;h=961fc77572d2faea847fbefc8f2ec4d614b01736;hp=30148bdd44e7f4be1fb88b33d406ae203b525788;hb=83fdfb28c41d23ca925df3708069fde58555a88c;hpb=6a611fb362129440369cb09a590023d6292102e9 diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index 30148bdd4..961fc7757 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -1,10 +1,16 @@ #include "csqcmodel_hooks.qh" -#include "mutators/events.qh" +#include "autocvars.qh" +#include "csqcmodel_hooks.qh" +#include "miscfunctions.qh" +#include #include "player_skeleton.qh" #include "weapons/projectile.qh" #include +#include #include #include +#include +#include #include #include #include @@ -12,10 +18,6 @@ .float death_time; .int modelflags; -void CSQCModel_Hook_PreDraw(entity this, bool isplayer); - -.bool isplayermodel; - // FEATURE: LOD .int lodmodelindex0; .int lodmodelindex1; @@ -128,11 +130,14 @@ void CSQCPlayer_ModelAppearance_PostUpdate(entity this) 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) @@ -142,7 +147,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) _setmodel(e, cvar_defstring("_cl_playermodel")); forceplayermodels_goodmodel = e.model; forceplayermodels_goodmodelindex = e.modelindex; - remove(e); + delete(e); } // first, try finding it from the server @@ -175,7 +180,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) forceplayermodels_model = e.model; forceplayermodels_modelindex = e.modelindex; forceplayermodels_skin = autocvar__cl_playerskin; - remove(e); + delete(e); } if(autocvar_cl_forcemyplayermodel != "" && autocvar_cl_forcemyplayermodel != forceplayermodels_mymodel) @@ -185,14 +190,14 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) forceplayermodels_myisgoodmodel = fexists(e.model); forceplayermodels_mymodel = e.model; forceplayermodels_mymodelindex = e.modelindex; - remove(e); + delete(e); } // apply it bool isfriend; int cm; cm = this.forceplayermodels_savecolormap; - cm = (cm >= 1024) ? cm : (stof(getplayerkeyvalue(cm - 1, "colors")) + 1024); + cm = (cm >= 1024) ? cm : (entcs_GetClientColors(cm - 1) + 1024); if(teamplay) isfriend = (cm == 1024 + 17 * myteam); @@ -277,9 +282,11 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer) this.colormap = player_localnum + 1; } + LABEL(skipforcemodels) + // GLOWMOD AND DEATH FADING if(this.colormap > 0) - this.glowmod = colormapPaletteColor(((this.colormap >= 1024) ? this.colormap : stof(getplayerkeyvalue(this.colormap - 1, "colors"))) & 0x0F, true) * 2; + this.glowmod = colormapPaletteColor(((this.colormap >= 1024) ? this.colormap : entcs_GetClientColors(this.colormap - 1)) & 0x0F, true) * 2; else this.glowmod = '1 1 1'; @@ -353,7 +360,7 @@ void CSQCPlayer_AnimDecide_PostUpdate(entity this, bool isnew) } 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) @@ -369,7 +376,7 @@ int CSQCPlayer_FallbackFrame(entity this, int f) case 29: return 4; // anim_duckwalkbackright -> anim_duckwalk case 30: return 4; // anim_duckwalkbackleft -> anim_duckwalk } - LOG_DEBUGF("Frame %d missing in model %s, and we have no fallback - FAIL!\n", f, this.model); + LOG_DEBUGF("Frame %d missing in model %s, and we have no fallback - FAIL!", f, this.model); return f; } void CSQCPlayer_FallbackFrame_Apply(entity this) @@ -391,8 +398,6 @@ void CSQCModel_AutoTagIndex_Apply(entity this) if(this.tag_entity && wasfreed(this.tag_entity)) this.tag_entity = NULL; - viewloc_SetTags(this); - MUTATOR_CALLHOOK(TagIndex_Update, this); if(this.tag_networkentity) @@ -408,7 +413,7 @@ void CSQCModel_AutoTagIndex_Apply(entity this) // 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) @@ -433,7 +438,7 @@ void CSQCModel_AutoTagIndex_Apply(entity this) // we need to prevent this from 'appening this.tag_entity = NULL; this.drawmask = 0; - LOG_TRACE("h_ model lacks weapon attachment, but v_ model is attached to it\n"); + LOG_TRACE("h_ model lacks weapon attachment, but v_ model is attached to it"); } } else if(this.tag_entity.isplayermodel) @@ -536,7 +541,7 @@ void CSQCModel_Effects_Apply(entity this) 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; @@ -562,7 +567,7 @@ void CSQCModel_Effects_Apply(entity this) { 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; } } @@ -570,7 +575,7 @@ void CSQCModel_Effects_Apply(entity this) { 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; } } @@ -593,7 +598,7 @@ void CSQCModel_Hook_PreDraw(entity this, bool isplayer) return; this.csqcmodel_predraw_run = framecount; - if(!this.modelindex || this.model == "null") + if(!this.modelindex || this.model == "null" || this.alpha < 0) { this.drawmask = 0; return; @@ -601,9 +606,9 @@ void CSQCModel_Hook_PreDraw(entity this, bool isplayer) else this.drawmask = MASK_NORMAL; - if(this.isplayermodel) // this checks if it's a player MODEL! + if(this.isplayermodel && 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) @@ -703,7 +708,9 @@ void CSQCModel_Hook_PreUpdate(entity this, bool isnew, bool isplayer, bool isloc 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)