NoScope (Removal)

Что это такое:

При включении зума у снайперок (AWP, Scout и пр..), появляется круг с прицелом. То что не в этом круге - мы увидеть не можем. NoScope позволяет нам убрать эту мешающую вещь.

 

Вариант 1:

1) Нужны хуки glBegin

Code:

// В 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

Code:
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

Code:
// 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
#include 
using 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

Hosted by uCoz