Ru/VGUI Screen Creation

== Добавление VGUI экрана на карту ==
# Создайте vgui_screen энтити. Это точечная энтити.
# Установите его Panel Name равным имени экрана, который должен отображаться. (Это не имя файла экрана.) Доступные экраны перечислены в (который должен находиться в каталоге ).
# Установите Ширина панели в мире и Высота панели в мире в соответствии с размером кисти. 64 в ширину на 32 в высоту было бы разумным начальным размером.
# Скомпилируйте карту и протестируйте.
Положение объекта на карте отмечает нижний левый угол панели. Направление панели (нормаль к ее грани) задается углом объекта (Yaw)..
== Создание VGUI экрана ==
Файлы экрана VGUI имеют расширение .res и должны быть помещены в ..
# - хорошая отправная точка для создания файла экрана VGUI; его можно найти по пути .
# Материалы, используемые в файле .res, можно найти в . Извлеките файлы материалов, упомянутые в файле .res, в .
# Добавьте экран в . Если его не существует, создайте его. Вот пример, описывающий экран в . Отрегулируйте его под свой экран.
 "VGUI_Screens"
 {
 "vgui_test_screen"
 {
 // This is our example screen
 "type"		"vgui_screen_panel"
 "pixelswide"	480
 "pixelshigh"	240
 // This must be the file you created in step 1
 "resfile"	"scripts/screens/vgui_test_screen.res"
 } 
 }
Пример файла находиться в .
==Модификации кода VGUI==
Возникла проблема с экранами VGUI, получающими ввод. Если это не исправить, игра может вылетать, когда курсор указывает на экран.
 вызывает без инициализации флагов кнопок, поэтому экран VGui обновляется с неверным вводом кнопки. Поскольку устанавливается только из , экраны VGui обновляются только тогда, когда флажки кнопки действительны.
Есть два известных исправления. Оба они включают изменения кода и поэтому применимы только к модам.
=== Фикс 1 ===
В src\game_shared\in_buttons.h, где определены другие флаги, добавить:
 #define IN_VALIDVGUIINPUT		 (1 << 23) //bitflag for vgui fix
дальше, в src\cl_dll\in_main.cpp внутри метода 
добавить:
 cmd->buttons |= IN_VALIDVGUIINPUT;
прямо над:
 g_pClientMode->CreateMove( input_sample_frametime, cmd );
дальше, в src\cl_dll\c_baseplayer.cpp внутри метода 
добавить:
 if(pCmd->buttons & IN_VALIDVGUIINPUT)
прямо над:
 DetermineVguiInputMode( pCmd );
(So it only calls if the buttons include our flag)
и наконец, внутри метода 
изменить оба экземпляра:
 pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2);
для чтения:
 pCmd->buttons &= ~(IN_ATTACK | IN_ATTACK2 | IN_VALIDVGUIINPUT);
После обновления движка в октябре, экраны VGUI аварийно завершают работу, когда вы наводите на них указатель мыши. Это связано с тем, что функция , используемая в , больше не работает. Попытка получить к нему доступ приводит к сбою. В качестве обходного пути оказалась полезной следующая функция .:
 	// Convert (u,v) into (px,py)
 	int px = (int)(u * m_nPixelWidth + 0.5f);
 	int py = (int)(v * m_nPixelHeight + 0.5f);
 
 // START TEDDYS FIX
 	for (int i = 0; i < pPanel->GetChildCount(); i++)
 	{
 		vgui::Button *child = dynamic_cast<vgui::Button*>(pPanel->GetChild(i));
 		if ( child )
 		{
 			int x1, x2, y1, y2;
 			child->GetBounds( x1, y1, x2, y2 );
 
 			// Generate mouse input commands
 			if ( (m_nButtonState & IN_ATTACK) )
 			{
 				if ( px >= x1 && px <= x1 + x2 && py >= y1 && py <= y1 + y2 )
 					child->FireActionSignal();
 			}
 		}
 	}
 // FIN TEDDYS FIX
 
 	if ( m_bLooseThinkNextFrame == true )
 	{
 		m_bLooseThinkNextFrame = false;
 		SetNextClientThink( CLIENT_THINK_NEVER );
 	}
=== Фикс 2 ===
Альтернативным исправлением может быть добавление новой логической переменной в , например , которая может быть установлена ​​в зависимости от допустимости флагов кнопки. Это позволит структуре внутренне хранить эту информацию в течение всего срока ее службы, освобождая при этом лишний бит кнопки.
== Скриншоты ==