From: Rudolf Polzer Date: Fri, 2 Dec 2011 09:12:28 +0000 (+0100) Subject: code attachment support (not used yet) X-Git-Tag: xonotic-v0.6.0~74^2~100^2~30 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=49da89fcf411248cb2808d22b3754ebac06d0f71;p=xonotic%2Fxonotic-data.pk3dir.git code attachment support (not used yet) --- diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index c96ce4ec8..57df75faa 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -3,7 +3,10 @@ .float lodmodelindex1; .float lodmodelindex2; -void CSQCModel_Hook_PreDraw() +.entity tag_entity; +.float tag_index; + +void CSQCModel_Hook_PreDraw(float isplayer) { // auto glowmod from colormap self.glowmod = colormapPaletteColor(((self.colormap >= 1024) ? (self.colormap & 0xFF) : stof(getplayerkeyvalue(self.entnum - 1, "colors"))), TRUE) * 2; @@ -65,5 +68,70 @@ void CSQCModel_Hook_PreDraw() self.modelindex = self.lodmodelindex0; } } -} + if(!isplayer) + { + if(self.tag_entity && wasfreed(self.tag_entity)) + self.tag_entity = world; + + if(self.tag_networkentity) + { + // we are ATTACHED! + if(self.tag_entity.entnum == self.tag_networkentity) + { + // already good + self.drawmask = MASK_NORMAL; + } + else + { + // to something NEW NEW NEW NEW! + self.tag_entity = findfloat(world, entnum, self.tag_networkentity); + if(self.tag_entity) + { + // the best part is: IT EXISTS + self.drawmask = MASK_NORMAL; + + if(substring(self.model, 0, 17) == "models/weapons/v_") + if(substring(self.tag_entity.model, 0, 17) == "models/weapons/h_") + { + self.tag_index = gettagindex(self.tag_entity, "weapon"); + if(!self.tag_index) + self.tag_index = gettagindex(self.tag_entity, "tag_weapon"); + if(!self.tag_index) + { + // we need to prevent this from 'appening + self.tag_entity = world; + self.drawmask = 0; + dprint("h_ model lacks weapon attachment, but v_ model is attached to it\n"); + } + } + + if(substring(self.model, 0, 17) == "models/weapons/v_") + if(substring(self.tag_entity.model, 0, 14) == "models/player/") + { + self.tag_index = gettagindex(self.tag_entity, "tag_weapon"); + if(!self.tag_index) + self.tag_index = gettagindex(self.tag_entity, "bip01 r hand"); + } + + if(substring(self.tag_entity.model, 0, 17) == "models/weapons/v_") + { + self.tag_index = gettagindex(self.tag_entity, "shot"); + if(!self.tag_index) + self.tag_index = gettagindex(self.tag_entity, "tag_shot"); + } + } + else + { + // damn, see you next frame + self.drawmask = 0; + } + } + } + else + { + // no brain no pain + self.drawmask = MASK_NORMAL; + } + } +} diff --git a/qcsrc/csqcmodel/cl_model.qc b/qcsrc/csqcmodel/cl_model.qc index f1607c08d..892626912 100644 --- a/qcsrc/csqcmodel/cl_model.qc +++ b/qcsrc/csqcmodel/cl_model.qc @@ -142,6 +142,11 @@ void CSQCModel_InterpolateAnimation_Do() 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_localentnum); + float isnolocalplayer = (isplayer && (self.entnum != player_localentnum)); + // we don't do this for the local player as that one is already handled // by CSQCPlayer_SetCamera() if(!CSQCPlayer_IsLocalPlayer()) diff --git a/qcsrc/csqcmodel/settings.qh b/qcsrc/csqcmodel/settings.qh index 2366347f9..414732924 100644 --- a/qcsrc/csqcmodel/settings.qh +++ b/qcsrc/csqcmodel/settings.qh @@ -30,7 +30,7 @@ #define CSQCMODEL_HOOK_PREUPDATE #define CSQCMODEL_HOOK_POSTUPDATE #define CSQCMODEL_HOOK_PREDRAW \ - CSQCModel_Hook_PreDraw(); + CSQCModel_Hook_PreDraw(isplayer); #define CSQCPLAYER_HOOK_POSTCAMERASETUP // mod must define: