Перейти к контенту

[SOC] Мелкие правки движка


Kondr48

Рекомендуемые сообщения

CRAZY_STALKER666, в исходниках вот здесь стоит посмотреть: FDemoRecord.cpp

if (psHUD_Flags.test(HUD_DRAW)){
			if ((Device.dwTimeGlobal/750)%3!=0) {
//				pApp->pFontSystem->SetSizeI	(0.02f);
				pApp->pFontSystem->SetColor	(color_rgba(255,0,0,255));
				pApp->pFontSystem->SetAligment(CGameFont::alCenter);
				pApp->pFontSystem->OutSetI	(0,-.05f);
				pApp->pFontSystem->OutNext	("%s","RECORDING");
				pApp->pFontSystem->OutNext	("Key frames count: %d",iCount);
				pApp->pFontSystem->SetAligment(CGameFont::alLeft);
				pApp->pFontSystem->OutSetI	(-0.2f,+.05f);
				pApp->pFontSystem->OutNext	("SPACE");
				pApp->pFontSystem->OutNext	("BACK");
				pApp->pFontSystem->OutNext	("ESC");
				pApp->pFontSystem->OutNext	("F11");
				pApp->pFontSystem->OutNext	("F12");
				pApp->pFontSystem->SetAligment(CGameFont::alLeft);
				pApp->pFontSystem->OutSetI	(0,+.05f);
				pApp->pFontSystem->OutNext	("= Append Key");
				pApp->pFontSystem->OutNext	("= Cube Map");
				pApp->pFontSystem->OutNext	("= Quit");
				pApp->pFontSystem->OutNext	("= Level Map ScreenShot");
				pApp->pFontSystem->OutNext	("= ScreenShot");
			}
		}

 

 

А в рамках 4 патча даже не знаю: хексом мб это искать и закомментировать. По сути это и смысл использования исходников: нашел то, что нужно и подправил/дописал. А так по сути тема больше для правок исходников.

Изменено пользователем Kondr48
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

НаноБот, если колбек нужен будет не только актору, то да. Согласен. Однако в случае с ножом, есть ли в этом смысл, если этот колбек будет использоваться только для актора?

P.S. Нет желания подкинуть сюда пару статеек по работе на исходниках? К примеру адаптацию Вашего проекта новая баллистика? Или те же колбеки?

Изменено пользователем Kondr48
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

UnLoaded

Версия исходников 1.0007(rc1)

Ну это еще не аргумент. Я например форкнулся с r180 с репозитория на xp-dev, собственно туторы по этой версии я и писал. Если у Вас именно "чистые" исходники, то для начала вам нужно добавить туда все недостоющие части кода по слотам из этой (или более высокой, если хотите) ревизии. А если ревизия итак оттуда, то, по данному "тутору" слоты легко создаются и 

m_slots_array

там присутствует.

Изменено пользователем Kondr48

Поделиться этим сообщением


Ссылка на сообщение

Все мы с Вами знаем, что в ЗП добавлен ряд интересных и полезных индикаторов на худе. На самом деле добавить их легко. Разберем на примере индикатора поломки брони.

Для начала, в движке CoP есть такой удобный инструмент как UIHelper, для дальнейшей работы он нам понадобится, поэтому добавляем в xrGame\ui:

1. UIHelper.h

////////////////////////////////////////////////////////////////////////////
//	Module 		: UIHelper.h
//	Created 	: 17.01.2008
//	Author		: Evgeniy Sokolov
//	Description : UI Helper class
////////////////////////////////////////////////////////////////////////////

#ifndef	UI_HELPER_H_INCLUDED
#define UI_HELPER_H_INCLUDED

class CUIXml;
class CUIWindow;
class CUIStatic;

class UIHelper
{
public:
	UIHelper		() {};
	~UIHelper		() {};

	static	CUIStatic*			CreateStatic		( CUIXml& xml, LPCSTR ui_path, CUIWindow* parent );
};

#endif // UI_HELPER_H_INCLUDED
 

2. UIHelper.cpp:

////////////////////////////////////////////////////////////////////////////
//	Module 		: UIHelper.cpp
//	Created 	: 17.01.2008
//	Author		: Evgeniy Sokolov
//	Description : UI Helper class implementation
////////////////////////////////////////////////////////////////////////////

#include "StdAfx.h"
#include "UIHelper.h"
#include "UIXmlInit.h"

CUIStatic* UIHelper::CreateStatic( CUIXml& xml, LPCSTR ui_path, CUIWindow* parent )
{
	CUIStatic* ui			= new CUIStatic();
	if(parent)
	{
		parent->AttachChild	( ui );
		ui->SetAutoDelete	( true );
	}
	CUIXmlInit::InitStatic	( xml, ui_path, 0, ui );
	return ui;
} 

Здесь я оставил только добавление статика, на самом деле в ЗП с помощью этого инструмента можно все что угодно добавлять. Переносите себе по мере необходимости  :), идем дальше.

Нам нужен файл UIMainIngameWnd.h

в группе protected: находим:

CUIZoneMap* UIZoneMap;

И после добавляем:

CUIStatic* m_ind_outfit_broken;

Теперь файл UIMainIngameWnd.cpp.

Сначала не забудьте прописать 

#include "UIHelper.h"

в начале файла там где все остальные.

Находим:

void CUIMainIngameWnd::Init()

К примеру, после:

m_UIIcons			= xr_new<CUIScrollView>(); m_UIIcons->SetAutoDelete(true);
xml_init.InitScrollView		(uiXml, "icons_scroll_view", 0, m_UIIcons);
AttachChild			(m_UIIcons); 

Добавим:

m_ind_outfit_broken		    = UIHelper::CreateStatic(uiXml, "indicator_outfit_broken", this); 

Затем находим: 

void CUIMainIngameWnd::Update() 

И, например, перед:

// health&power
	UIHealthBar.SetProgressPos		(m_pActor->GetfHealth()*100.0f);
	UIMotionIcon.SetPower			(m_pActor->conditions().GetPower()*100.0f); 

Добавим:

PIItem	pItem = m_pActor->inventory().ItemFromSlot(OUTFIT_SLOT);
	m_ind_outfit_broken->Show(false);
	if (pItem)
	{
		float condition = pItem->GetCondition();
	    if (condition<0.75f)
	    {
		  m_ind_outfit_broken->Show(true);
		  if(condition>0.5f)
			m_ind_outfit_broken->InitTexture("ui_inGame2_circle_Armorbroken_green");
		  else if(condition>0.25f)
			m_ind_outfit_broken->InitTexture("ui_inGame2_circle_Armorbroken_yellow");
		  else
			m_ind_outfit_broken->InitTexture("ui_inGame2_circle_Armorbroken_red");
	     }
	} 

Теперь разберем что нужно будет сделать в конфигах.

indicator_outfit_broken 

это имя статика. Добавить надо его в maingame.xml вот так:

 <indicator_outfit_broken x="980" y="410" width="26" height="35" stretch="1"/> 

ну и, соответственно, "зарегистрировать" в игре вот эти текстуры:

"ui_inGame2_circle_Armorbroken_green"
"ui_inGame2_circle_Armorbroken_yellow"
"ui_inGame2_circle_Armorbroken_red"

На этом всё  :) . Собственно у меня по такой схеме сделаны все подобные иконки, потому что система ТЧ показалась мне неоправданно сложной и громоздкой. Ну, быть может, это на мой дилетантский взгляд.  :)

P.S. Конечно, лучше совместить прогресс бар, который показывает состояние брони и этот индикатор. Чтобы два раза не дергать состояние костюма на апдейте. Но я не стал усложнять урок)

 

 

Изменено пользователем Kondr48
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

Совсем мелочь, но мне понадобилось, мб ещё кому-то будет надо.

В SHoC существует три функции, для возврата игрового времени, в пространстве level:

get_time_days() -- день
get_time_hours() -- час
get_time_minutes() -- минута

Собственно, для своих целей я добавил аналогичные функции, которые возвращают текущий месяц и год.

level_script.cpp:

Перед:

u32 get_time_days()
{
	u32 year = 0, month = 0, day = 0, hours = 0, mins = 0, secs = 0, milisecs = 0;
	split_time(Level().GetGameTime(), year, month, day, hours, mins, secs, milisecs);
	return			day;
} 

добавим:

u32 get_time_year()
{
	u32 year = 0, month = 0, day = 0, hours = 0, mins = 0, secs = 0, milisecs = 0;
	split_time(Level().GetGameTime(), year, month, day, hours, mins, secs, milisecs);
	return			year;
}

u32 get_time_month()
{
	u32 year = 0, month = 0, day = 0, hours = 0, mins = 0, secs = 0, milisecs = 0;
	split_time(Level().GetGameTime(), year, month, day, hours, mins, secs, milisecs);
	return			month;
}

и перед:

def("get_time_days",					get_time_days),

добавим:

def("get_time_year",					get_time_year),
def("get_time_month",					get_time_month),

На этом - всё, использовать в своих скриптах, вот так:

local year = level.get_time_year()
local month = level.get_time_month()

 

 

Изменено пользователем Kondr48
  • Нравится 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

Итак, за те картинки и надписи, которые мы видим при загрузке локации / сохранения, отвечает файл x_ray.cpp.

Не только за них, но всё, что мы там видим настраивается именно в нём. Собственно, интерес представляет:

load_texture = "ui\\ui_load";

Всё однозначно - фон загрузочного экрана.

strconcat					(sizeof(temp),temp,"intro\\intro_",Levels[L].folder);

тут формируется картинка загружаемой локации.

А это:

hLevelLogo.create	("font", "intro\\intro_no_start_picture"); 

текстура "белого шума" которая выводится, если нужной картинки для локации у нас нету.

Это:

pFontSystem->SetColor		(color_rgba(35,71,74,255)); 

Цвет надписей типа: "Клиент: синхронизация". RGBA

Это:

		pFontSystem->OutI			(0.f,0.524f,app_title); 

Координаты надписи: x,y. Надпись отрисовывается по центру, о чём нам говорит:

pFontSystem->SetAligment	(CGameFont::alCenter);

Теперь, как настраивать размер и положение картинки загружаемой локации:

находим:

//draw level-specific screenshot
		if(hLevelLogo){ 

смотрим дальше:

r.lt.set					(0,175); 

собственно, координаты, x и y.

А это:

r.rb.add					(r.lt,Fvector2().set(1024,399)); 

уже размеры, длина ширина.

В прогресс бар, честно, не вникал. Ну не нравится мне его реализация. У себя я его просто закомментировал. Но настройки можно посмотреть после:

progress bar
		back_size.set				(479,26); 

 

 

  • Спасибо 1
  • Нравится 1
  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение

Кто-то из форумчан Карлан упоминал, вспомнил вот. Ошибка-опечатка в оригинальном репозитории xp-dev в колбеке на before save (вызывается перед созданием сейва, насколько я понял), точно есть с r180 и до финальной так и осталось.

script_game_object_script.cpp:

находим:

value("on_before_save", int(GameObject::ePostSave)),

и заменяем на:

value("on_before_save", int(GameObject::eBeforeSave)),
Изменено пользователем Kondr48
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

Исправление сохранения клиентских объектов.

Скрытый текст

Автор: Shoker

Более подробно о ошибке
 
Из за этой опечатки в оригинале есть баг, что при сохранении игры в серверный объект попадают данные клиентского объекта, устаревшие на несколько апдейтов - именно в момент сохранения синхронизации не происходит. (Например если убрать в оружии сохранение патронов у клиентского объекта в CWeaponMagazined::save, оставив сохранение патронов только у серверного объекта - то если выстрелить и сразу сохраниться -> при загрузке число патронов будет прежним) 
 
Кто хочет понять природу бага - надо начинать смотреть с функции void CALifeStorageManager::prepare_objects_for_save() в alife_storage_manager.cpp. Она вызывается во время сохранения и в свою очередь вызывает CLevel::ClientSend(), однако там из за опечатки происходит проверка на пропускную способность сети net_HasBandwith() (для МП), которая в 99% возвращает false. 
 
Баг не то, чтобы критичный но всё же серьёзный.
 
Исправление:
В файле xr_3da\xrGame\Level_network.cpp в начале функции 

void CLevel::ClientSend()
Перед проверкой GameID() == GAME_SINGLE нужно поставить отрицание:

if (GameID() != GAME_SINGLE && OnClient())

 

Фикс вертикальной синхронизации (r2)

Скрытый текст

Автор: SkyLoader

Файл: xr_3da\HW.cpp

Найти


DevPP.PresentationInterval    = D3DPRESENT_INTERVAL_IMMEDIATE;

и


P.PresentationInterval    = D3DPRESENT_INTERVAL_IMMEDIATE;

Затем просто заменить D3DPRESENT_INTERVAL_IMMEDIATE на selectPresentInterval()

 Добавление изменения переносимого веса в свойства артефактов.

Скрытый текст

Artifact.h:

после:


float							m_fBleedingRestoreSpeed; 

добавить:


float							m_additional_weight; 

Artifact.cpp:

После:


SetSlot (ARTEFACT_SLOT);

добавить:


m_additional_weight			= 0.0f; 

После:


m_fBleedingRestoreSpeed      = pSettings->r_float(section,"bleeding_restore_speed"); 

добавить:


m_additional_weight		     = pSettings->r_float(section,"additional_inventory_weight"); 

ActorCondition.cpp:

после:


		CCustomOutfit* outfit	= m_object->GetOutfit();
		if(outfit)
			max_w += outfit->m_additional_weight; 

добавить:


for(TIItemContainer::const_iterator it = object().inventory().m_belt.begin(); object().inventory().m_belt.end() != it; ++it) 
	     {
		   CArtefact*	cast_artefact = smart_cast<CArtefact*>(*it);
		     if(cast_artefact)
			   max_w	+= cast_artefact->m_additional_weight;
	     } 

Чтобы добавляемый вес отображался в описании артефакта. На самом деле это стоит поверять: сработает ли именно так, потому что у себя я просто много уже в этом окошке переписывал

Скрытый текст

ui_af_params.h:

после:



_item_bleeding_restore_speed, 

добавить:



_item_additional_inventory_weight, 

находим:



LPCSTR af_item_sect_names[] = { 

после:



"bleeding_restore_speed", 

добавим:



"additional_inventory_weight", 

находим:



LPCSTR af_item_param_names[] = { 

после:



"ui_inv_bleeding", 

добавим:



"ui_inv_additional_inventory_weight", 

после:



		LPCSTR _sn = "%";
		if(i==_item_radiation_restore_speed || i==_item_power_restore_speed)
		{
			_val				/= 100.0f;
			_sn					= "";
		} 

добавим:



		else if (i==_item_additional_inventory_weight)
		{
			_val				/= 100.0f;
			_sn					= *CStringTable().translate("st_kg");
		} 

 

 

 

Изменено пользователем Kondr48
  • Спасибо 1
  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение

А есть ли возможность вывести в xml файл, а из него тогда редактировать загрузочный экран?

Это не так просто как кажется, xml он в xr_game, а загрузочный экран в экзешнике, а экзешник он перед xr_game собирается, т. е там надо будет как-то переносить в xr_game это, что скорее всего будет не так просто, как я думаю.

Изменено пользователем Kondr48
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

Остается только продумать, как организовать указание движку, откуда иконки читать...

Конкретно текстура иконок в нескольких местах читается, там надо просто найти место, где задается иконка и там уже задавать путь к текстуре. А везде где дергается текстура просто функцией вроде get_enqurimet_texture() читать. Сложностей возникнуть не должно, надо просто размотать всю эту цепочку и вникнуть где что и откуда читается и куда присваивается, чтобы свое добавить.

Потестил, вроде все как надо. Хотя может можно и по другому ?

Да, в принципе, как и надо, я правда не вникал, во всех ли названный случаях вызвается drop, но если все работает, то это хорошо.

Изменено пользователем Kondr48

Поделиться этим сообщением


Ссылка на сообщение

Прошу кого-нибудь на чистой ревизии попробовать по тутору добавить артефакту переносимый вес и отписаться все ли корректно-таки работает.

Поделиться этим сообщением


Ссылка на сообщение

В файле xray\xr_3da\xrRender\r__screenshot.cpp находим:

case IRender_interface::SM_NORMAL: 

Заменяем:

CHK_DX				(D3DXSaveSurfaceToFileInMemory (&saved,D3DXIFF_JPG,pFB,0,0));  

на:

CHK_DX				(D3DXSaveSurfaceToFileInMemory (&saved,D3DXIFF_PNG,pFB,0,0)); 

Теперь расширение, чуть выше меняем:

ss_%s_%s_(%s).jpg 

на, соответственно:

ss_%s_%s_(%s).png 

P. S. на самом деле, кроме формата png есть и другие варианты)

typedef enum _D3DXIMAGE_FILEFORMAT
{
    D3DXIFF_BMP         = 0,
    D3DXIFF_JPG         = 1,
    D3DXIFF_TGA         = 2,
    D3DXIFF_PNG         = 3,
    D3DXIFF_DDS         = 4,
    D3DXIFF_PPM         = 5,
    D3DXIFF_DIB         = 6,
    D3DXIFF_HDR         = 7,       //high dynamic range formats
    D3DXIFF_PFM         = 8,       //
    D3DXIFF_FORCE_DWORD = 0x7fffffff

} 

Т. е, доступны такие расширения, как: bmp, jpg, tga, png, dds, ppm, dib, hdr, pfm.

 

 

 

 

  • Нравится 2
  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...