NoScope (Removal) |
Что это такое:
При включении зума у снайперок (AWP, Scout и пр..), появляется круг с прицелом. То что не в этом круге - мы увидеть не можем. NoScope позволяет нам убрать эту мешающую вещь.
Вариант 1:
1) Нужны хуки glBegin
// В glBegin:
if (mode == GL_QUADS)
{
GLfloat scopecol[4];
glGetFloatv(GL_CURRENT_COLOR, scopecol);
if(scopecol[0]==1.0f && scopecol[1]==1.0f && scopecol[2]==1.0f && scopecol[3]==1.0f)
{
glEnable(GL_BLEND);
glColor4f(scopecol[0],scopecol[1],scopecol[2],0.0f);
glDisable(GL_BLEND);
}
}
2) Самый примитивный вариант, есть недостатки этого метода. Стоит сделать проверку, того есть ли у нас снайперка + в режиме зума.
Вариант 2:
1) Спасибо: ant_man. Нужны хуки glBegin, glTexCoord2f и glVertex2f
bool bScope = false;
float tex[4][2];
int vert_i = 0;
// В glBegin
if((cvar.noscope < 255) && (mode == GL_QUADS || mode == GL_POLYGON))
{
bScope = true;
if(!glIsEnabled(GL_BLEND))
{
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
}
}
else bScope = false;
// В glTexCoord2f
if(bScope)
{
tex[vert_i][0] = x;
tex[vert_i][1] = y;
}
// В glVertex2f
static float quad[4][2];
if(bScope)
{
quad[vert_i][0] = x;
quad[vert_i][1] = y;
++vert_i &= 3;
if(!vert_i)
{
if((quad[3][1]-quad[0][1]>20.f)&&((quad[3][1]-quad[0][1]>displayCenterY * .55f) || (quad[1][0]-quad[0][0]>displayCenterX * .55f)))
{
glColor4ub(0,0,0,cvar.noscope); // Уровень прозрачности
}
glTexCoord2f(tex[0][0],tex[0][1]);
glVertex2f(quad[0][0],quad[0][1]);
glTexCoord2f(tex[1][0],tex[1][1]);
glVertex2f(quad[1][0],quad[1][1]);
glTexCoord2f(tex[2][0],tex[2][1]);
glVertex2f(quad[2][0],quad[2][1]);
glTexCoord2f(tex[3][0],tex[3][1]);
glVertex2f(quad[3][0],quad[3][1]);
}
}
2) Довольно продвинутый вариант, есть возможность выставлять нужный уровень прозрачности scope. Ну, ещё конечно не помешает проверка на снайперку и зум.
Вариант 3:
1) Самый удачный вариант by OGC. Нужны хуки Engine Functions ->pfnSPR_Load / pfnSPR_Set / pfnSPR_Draw / pfnSPR_DrawHoles
// SniperInfo.cpp #include "SniperInfo.h" Sniper gSniper; #include < fstream > using namespace std; void Sniper::add(unsigned int handle, const char* name) { if( handle>=MAX || strlen(name)<=10 ) { return; } vSpriteFlags[handle] = false; name += 8; // skip "sprites/" if(0){} else if(!strncmp(name,"ch_",3)) { hCrosshair1 = handle; } else if(!strncmp(name,"sni",3)) { hCrosshair2 = handle; } else if(!strncmp(name,"cro",3)) { hCrosshairSmall = handle; } else if(!strncmp(name,"top",3)) { vSpriteFlags[handle] = true; } else if(!strncmp(name,"bot",3)) { vSpriteFlags[handle] = true; } else if(!strncmp(name,"lef",3)) { vSpriteFlags[handle] = true; } else if(!strncmp(name,"rig",3)) { vSpriteFlags[handle] = true; } else if(!strncmp(name,"ver",3)) { vSpriteFlags[handle] = true; } else if(!strncmp(name,"hor",3)) { vSpriteFlags[handle] = true; } } // SniperInfo.h #pragma once #includeusing namespace std; class Sniper { public: Sniper() : vSpriteFlags(MAX), hCrosshair1(0), hCrosshair2(0) {} void add(unsigned int handle, const char* name); bool bSkipDraw; bool isBlackoutSprite(unsigned int handle) { return (handle < MAX) ? vSpriteFlags[handle] : false; } unsigned int hCrosshair1; unsigned int hCrosshair2; unsigned int hCrosshairSmall; protected: enum { MAX = 512 }; vector vSpriteFlags; }; extern Sniper gSniper; // В SPR_Load gSniper.add( spr, szPicName); // В SPR_Set gSniper.bSkipDraw = cvar.noscope && gSniper.isBlackoutSprite(hPic); // В SPR_Draw if (gSniper.bSkipDraw) return; // В SPR_DrawHoles if (gSniper.bSkipDraw) return;
2) Тут уже ненадо делать никаких проверок, просто отменяем отрисовку спрайтов. Возможно неработает в CS 1.6 :-? Это вам проверять, просто надо сделать лог спрайтов проходящих через SPR_Set
Copyright (c) Troll