//Класс HUD элемента AG_Inventar
#include "cbase.h"
#include "hud.h"
#include "cbase.h"
#include "hudelement.h"
#include "hud_macros.h"
#include "vgui/iinput.h"
#include <vgui_controls/Panel.h>
#include <vgui_controls/Frame.h>
#include <vgui/IScheme.h>
#include <vgui_controls/Label.h>
#include <vgui_controls/ImagePanel.h>
#include <vgui_controls/PanelListPanel.h>
#include "iclientmode.h"
#include "vgui/ISurface.h"
#include "vgui/IInputInternal.h"
//#include "AG_Item.h"
//Объявление класса
class CAG_Inventar : public CHudElement , public vgui::Panel
{
DECLARE_CLASS_SIMPLE( CAG_Inventar, vgui::Panel );
public:
CAG_Inventar( const char *pElementName ); //конструктор
void Init( void ); //вызывается сразу после создания элемента
void VidInit( void ); //тоже что и Init только вызывается один раз при загрузке карты
void Reset(); //вызывается при сбросе HUD
void Paint( void ); //данный метод вызывается в каждом фрейме, для отрисовки элемента на экране
void OnThink(void); //также вызывается в каждом фрейме, для обновления информации
void MsgFunc_MyTxtMessage( bf_read &msg );
bool DrawInventarState;
private:
vgui::HScheme scheme; //Объект схемы для использования информации из схем
char m_pText[1024];
//Массивы предметов
CHudTexture* ItemIco;
//Переменные класса
int MouseX;
int MouseY;
int x;
int y;
int yy;
int w;
int h;
int DrawItem;
int Scroll;
int ScrollMax;
int weaponX;
int weaponY;
int InventoryH;
int InventoryW;
int ItemNumber;
int BaseInventarX;
int BaseInventarY;
int Eve;
int ScreenW;
int ScreenH;
int Box;
bool DrawDescription;
//Текстуры
//Элементы инвентаря
CHudTexture* m_Net;
CHudTexture* m_Inventar;
CHudTexture* m_Slots;
CHudTexture* m_Scroll;
CHudTexture* m_Scroll_Inventory;
CHudTexture* m_Belt;
CHudTexture* m_Cursor;
//Иконки оружия
CHudTexture* m_IcoAbakan;
CHudTexture* m_IcoSVD;
CHudTexture* m_IcoSVU;
CHudTexture* m_IcoVintorez;
CHudTexture* m_IcoLR300;
CHudTexture* m_IcoBuldog6;
CHudTexture* m_IcoHKG36;
CHudTexture* m_IcoL800;
CHudTexture* m_IcoGroza;
CHudTexture* m_IcoAK74U;
CHudTexture* m_IcoAK74;
CHudTexture* m_IcoSIG550;
CHudTexture* m_IcoFN2000;
CHudTexture* m_IcoMP5;
CHudTexture* m_IcoRPG7;
CHudTexture* m_IcoObrez;
CHudTexture* m_IcoTOZ34;
CHudTexture* m_IcoSpas12;
CHudTexture* m_IcoGaus;
CHudTexture* m_IcoPM;
CHudTexture* m_IcoFort12;
CHudTexture* m_IcoWalther;
CHudTexture* m_IcoBeretta;
CHudTexture* m_IcoBlack;
CHudTexture* m_IcoWinchester1300;
CHudTexture* m_IcoVal;
//Методы
//virtual void ShowPanel( bool bShow );
protected:
virtual void ApplySchemeSettings(vgui::IScheme *scheme);
virtual void OnMouseWheeled(int delta);
virtual void OnMousePressed(vgui::MouseCode code);
virtual void OnEvent( int event );
};
//Регистрация класса для HUD элемента
DECLARE_HUDELEMENT( CAG_Inventar );
//Регистрация приемника сообщений
DECLARE_HUD_MESSAGE( CAG_Inventar, MyTxtMessage );
using namespace vgui;
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
//Имплементация конструктора
CAG_Inventar::CAG_Inventar( const char *pElementName ) : CHudElement( pElementName ), vgui::Panel( NULL, "AG_Inventar" )
{
scheme = vgui::scheme()->LoadSchemeFromFile("resource/ClientScheme.res", "ClientScheme");
SetScheme(scheme);
//Инициализация переменных
vgui::Panel *pParent = g_pClientMode->GetViewport();
SetParent( pParent );
this->SetMouseInputEnabled(true);
this->MakePopup(false,true);
ItemNumber = 7;
SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD );
}
//Имплементация других методов
void CAG_Inventar::ApplySchemeSettings( vgui::IScheme *scheme )
{
BaseClass::ApplySchemeSettings(scheme);
SetPaintBackgroundEnabled(false);
SetPaintBorderEnabled(false);
//Элементы инвентаря
m_Net = gHUD.GetIcon("ui_debug_font");
m_Inventar = gHUD.GetIcon("Inventar");
m_Slots = gHUD.GetIcon("Slots");
m_Scroll = gHUD.GetIcon("Scroll");
m_Scroll_Inventory=gHUD.GetIcon("Scroll_Inventory");
m_Belt = gHUD.GetIcon("Belt");
m_Cursor = gHUD.GetIcon("Cursor");
//Иконки оружия
m_IcoAbakan = gHUD.GetIcon("AG_Ico_Abakan");
m_IcoSVD = gHUD.GetIcon("AG_Ico_SVD");
m_IcoSVU = gHUD.GetIcon("AG_Ico_SVU");
m_IcoVintorez=gHUD.GetIcon("AG_Ico_Vintorez");
m_IcoLR300 = gHUD.GetIcon("AG_Ico_LR300");
m_IcoBuldog6= gHUD.GetIcon("AG_Ico_Buldog6");
m_IcoHKG36 = gHUD.GetIcon("AG_Ico_HKG36");
m_IcoL800 = gHUD.GetIcon("AG_Ico_L800");
m_IcoGroza = gHUD.GetIcon("AG_Ico_Groza");
m_IcoAK74U = gHUD.GetIcon("AG_Ico_AK74U");
m_IcoAK74 = gHUD.GetIcon("AG_Ico_AK74");
m_IcoSIG550 = gHUD.GetIcon("AG_Ico_SIG550");
m_IcoFN2000 = gHUD.GetIcon("AG_Ico_FN2000");
m_IcoMP5 = gHUD.GetIcon("AG_Ico_MP5");
m_IcoRPG7 = gHUD.GetIcon("AG_Ico_RPG7");
m_IcoObrez = gHUD.GetIcon("AG_Ico_Obrez");
m_IcoTOZ34 = gHUD.GetIcon("AG_Ico_TOZ34");
m_IcoSpas12 = gHUD.GetIcon("AG_Ico_Spas12");
m_IcoGaus = gHUD.GetIcon("AG_Ico_Gaus");
m_IcoPM = gHUD.GetIcon("AG_Ico_PM");
m_IcoFort12 = gHUD.GetIcon("AG_Ico_Fort12");
m_IcoWalther= gHUD.GetIcon("AG_Ico_Walther");
m_IcoBeretta= gHUD.GetIcon("AG_Ico_Beretta");
m_IcoBlack = gHUD.GetIcon("AG_Ico_Black");
m_IcoWinchester1300 = gHUD.GetIcon("AG_Ico_Winchester");
m_IcoVal = gHUD.GetIcon("AG_Ico_Val");
}
void CAG_Inventar::Init( void )
{
//Устанавливаем перехват сообщений
HOOK_HUD_MESSAGE( CAG_Inventar, MyTxtMessage )
Reset();
}
void CAG_Inventar::VidInit( void )
{
Reset();
}
void CAG_Inventar::Reset( void )
{
//стираем содержимое текста
}
void CAG_Inventar::Paint( void )
{
//определяем требуется ли отображать элемент
ConVar *is_vis = cvar->FindVar( "AG_Inventar_visible" );
if(!is_vis->GetBool()) return;
ScreenW = vgui::scheme()->GetProportionalScaledValue(640);
ScreenH = vgui::scheme()->GetProportionalScaledValue(480);
BaseInventarX = vgui::scheme()->GetProportionalScaledValue(23);
BaseInventarY = vgui::scheme()->GetProportionalScaledValue(186);
InventoryW = vgui::scheme()->GetProportionalScaledValue(178.5);
InventoryH = vgui::scheme()->GetProportionalScaledValue(255);
Box = vgui::scheme()->GetProportionalScaledValue(25.5);
weaponY = Scroll + BaseInventarY;
this->MakePopup(true,false);
for(int i=0; i<10;i++)
{
pItem->Ico[i] = *m_IcoLR300;
pItem->Width[i] = 4;
pItem->Height[i] = 2;
}
//pItem.Ico[2] = *m_IcoBlack;
//pItem.Width[2] = 2;
//pItem.Height[2] = 1;
//pItem.Description[2] = *"Это пистолет, крутой пистолет";
//pItem.Name[2] = *"Чёрный ястреб";
//pItem.Type[2] = *"weapon1";
//pItem.Ico[5] = *m_IcoAK74;
//pItem.Ico[7] = *m_IcoAbakan;
//Пояс
x = vgui::scheme()->GetProportionalScaledValue(7);
y = vgui::scheme()->GetProportionalScaledValue(111);
w = vgui::scheme()->GetProportionalScaledValue(620);
h = vgui::scheme()->GetProportionalScaledValue(55);
m_Belt->DrawSelfCropped(x,y,0,0,996,102,w,h,Color(255,255,255,255));
//Раздел слотов
x = vgui::scheme()->GetProportionalScaledValue(5);
y = vgui::scheme()->GetProportionalScaledValue(12);
w = vgui::scheme()->GetProportionalScaledValue(639);
h = vgui::scheme()->GetProportionalScaledValue(90);
m_Slots->DrawSelfCropped(x,y,0,0,1024,128,w,h,Color(255,255,255,255));
//Сеть в базовом инвентаре
m_Net->DrawSelfCropped(BaseInventarX,BaseInventarY,29,29,210,300,InventoryW,InventoryH,Color(255,255,255,255));
//Сеть в 1 слоте
x = vgui::scheme()->GetProportionalScaledValue(19);
y = vgui::scheme()->GetProportionalScaledValue(26);
w = vgui::scheme()->GetProportionalScaledValue(66);
h = vgui::scheme()->GetProportionalScaledValue(66);
m_Net->DrawSelfCropped(x,y,29,29,60,60,w,h,Color(255,255,255,255));
//Сеть в 2 слоте
x = vgui::scheme()->GetProportionalScaledValue(110);
y = vgui::scheme()->GetProportionalScaledValue(26);
w = vgui::scheme()->GetProportionalScaledValue(66);
h = vgui::scheme()->GetProportionalScaledValue(66);
m_Net->DrawSelfCropped(x,y,29,29,60,60,w,h,Color(255,255,255,255));
//Сеть в 3 слоте
x = vgui::scheme()->GetProportionalScaledValue(204);
y = vgui::scheme()->GetProportionalScaledValue(26);
w = vgui::scheme()->GetProportionalScaledValue(198);
h = vgui::scheme()->GetProportionalScaledValue(66);
m_Net->DrawSelfCropped(x,y,29,29,180,60,w,h,Color(255,255,255,255));
//Сеть в 4 слоте
x = vgui::scheme()->GetProportionalScaledValue(424);
y = vgui::scheme()->GetProportionalScaledValue(26);
w = vgui::scheme()->GetProportionalScaledValue(66);
h = vgui::scheme()->GetProportionalScaledValue(66);
m_Net->DrawSelfCropped(x,y,29,29,60,60,w,h,Color(255,255,255,255));
//Сеть в 5 слоте
x = vgui::scheme()->GetProportionalScaledValue(515);
y = vgui::scheme()->GetProportionalScaledValue(26);
w = vgui::scheme()->GetProportionalScaledValue(99);
h = vgui::scheme()->GetProportionalScaledValue(66);
m_Net->DrawSelfCropped(x,y,29,29,90,60,w,h,Color(255,255,255,255));
//Сеть на поясе
x = vgui::scheme()->GetProportionalScaledValue(20);
y = vgui::scheme()->GetProportionalScaledValue(126);
w = vgui::scheme()->GetProportionalScaledValue(594);
h = vgui::scheme()->GetProportionalScaledValue(33);
m_Net->DrawSelfCropped(x,y,29,29,540,30,w,h,Color(255,255,255,255));
if(ItemNumber > 0) //Если у нас есть предметы
{
for( int ItemIndex = 0; ItemIndex <= ItemNumber; ItemIndex++ ) //Цикл прорисовки предметов
{
h = pItem->Height[ItemIndex]*Box; //Ширина (реал)
w = pItem->Width[ItemIndex]*Box; //Длина (реал)
int delta; //Выступ предмета вверху
if(weaponY - BaseInventarY + h <= InventoryH)
{
if(weaponY + h >= BaseInventarY)
{
if(weaponY < BaseInventarY)
{
delta = (BaseInventarY - weaponY)/Box;
pItem->Ico[ItemIndex].DrawSelfCropped(BaseInventarX,weaponY + delta*Box,0,delta*50,pItem->Width[ItemIndex]*50,pItem->Height[ItemIndex]*50 - delta*50,w,h - delta*Box,Color(255,255,255,255));
pItem->X[ItemIndex] = BaseInventarX;
pItem->Y[ItemIndex] = weaponY + delta*Box;
}
else
{
pItem->Ico[ItemIndex].DrawSelfCropped(BaseInventarX,weaponY,0,0,pItem->Width[ItemIndex]*50,pItem->Height[ItemIndex]*50,w,h,Color(255,255,255,255));
pItem->X[ItemIndex] = BaseInventarX;
pItem->Y[ItemIndex] = weaponY;
}
}
}
weaponY = weaponY + h;
}
//Прорисовка полосы прокрутки
if(weaponY - BaseInventarY - Scroll > InventoryH)
{
x = vgui::scheme()->GetProportionalScaledValue(202);
w = vgui::scheme()->GetProportionalScaledValue(14);
m_Scroll_Inventory->DrawSelfCropped(x,BaseInventarY,0,0,14,255,w,InventoryH,Color(255,255,255,255));
}
}
//Базовый инвентарь
x = vgui::scheme()->GetProportionalScaledValue(7);
y = vgui::scheme()->GetProportionalScaledValue(170);
w = vgui::scheme()->GetProportionalScaledValue(621);
h = vgui::scheme()->GetProportionalScaledValue(299);
m_Inventar->DrawSelfCropped(x,y,0,0,996,482,w,h,Color(255,255,255,255));
//Прорисовка описания предмета.
if(DrawDescription == true)
{
x = vgui::scheme()->GetProportionalScaledValue(411);
y = vgui::scheme()->GetProportionalScaledValue(234);
h = pItem->Height[DrawItem]*Box; //Ширина (реал)
w = pItem->Width[DrawItem]*Box; //Длина (реал)
pItem->Ico[DrawItem].DrawSelfCropped(x-w/2,y-h/2,0,0,pItem->Width[DrawItem]*50,pItem->Height[DrawItem]*50,w,h,Color(255,255,255,255));
}
//Прорисовка курсора шыши
//vgui::input()->GetCursorPosition(x,y);
//mouseX = mouseX + x - ScreenW/2;
//mouseY = mouseY + y - ScreenH/2;
//if(mouseX < 0) {mouseX = 0;}
//if(mouseY < 0) {mouseY = 0;}
//if(mouseX > ScreenW) {mouseX = ScreenW;}
//if(mouseY > ScreenH) {mouseY = ScreenH;}
//m_Cursor->DrawSelf(x,y,Color(255,255,255,255));
}
void CAG_Inventar::OnEvent( int event )
{
}
void CAG_Inventar::OnMousePressed(vgui::MouseCode code)
{
if(code == MOUSE_LEFT)
{
vgui::input()->GetCursorPosition(MouseX,MouseY);
for( int ItemIndex = 0; ItemIndex <= ItemNumber; ItemIndex++ )
{
if(MouseX <= pItem->X[ItemIndex])
{
if(MouseX >= pItem->X[ItemIndex] + pItem->Width[ItemIndex])
{
if(MouseY <= pItem->Y[ItemIndex])
{
if(MouseY >= pItem->Y[ItemIndex] + pItem->Height[ItemIndex])
{
DrawItem = ItemIndex;
DrawDescription = true;
}
}
}
}
}
}
}
void CAG_Inventar::OnMouseWheeled(int delta)
{
delta*= Box;
if(Scroll + delta <=0)
{
Scroll = Scroll + delta;
}
}
void CAG_Inventar::OnThink(void)
{
//определяем требуется ли изменить видимость элемента
ConVar *is_vis = cvar->FindVar( "AG_Inventar_visible" );
if(is_vis->GetBool()) SetVisible(true);
else SetVisible(false);
}
void CAG_Inventar::MsgFunc_MyTxtMessage( bf_read &msg )
{
sprintf(m_pText, msg.ReadAndAllocateString());
}
//Создаем консольную переменную на стороне клиента для управления видимостью элемента
ConVar myhud_visible("AG_Inventar_visible", "0", FCVAR_NONE, "AG_Inventar visibility", true, 0, true, 1);
//Создаем консольную комманду на стороне клиента для переключения видимости элемента
void CC_myhud_visible ( void )
{
ConVar *is_vis = cvar->FindVar( "AG_Inventar_visible" );
if(is_vis->GetBool())
engine->ClientCmd( "AG_Inventar_visible 0" );
else
engine->ClientCmd( "AG_Inventar_visible 1" );
}
static ConCommand myhud( "AG_Inventar", CC_myhud_visible, "parameter");