Перейти к содержанию

СТАЛКЕР. Беск. патроны у игрока. Объектный тип


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

Меня попросили выложить старую статью. Мне она не нравится. Она запутана и в ней не всё хорошо, но для тех, кто хочет могут почитать. Насколько помню у меня получились бесконечные патроны таким способом только в Тени Чернобыля.

В статье кажется речь идёт о СТАЛКЕР-е Зов припяти 1.6 К сожалению не помню точно для какой это версии игры, может быть это для Тени Чернобыля.

Оформлять некогда. Вот архив

ЧАСТЬ 1_Взлом патронов в СТАЛКЕР.rar

Изменено пользователем Andrey
Ссылка на комментарий
Поделиться на другие сайты

Благодарю за статью. С патронами легко, так как они есть, а вот предмет, которые черте как искать по всей игре, это жесть)) Благо мануал есть)

Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

Простите Мастер, я не понял как вы нашли эту инструкцию http://s2.ipicture.ru/uploads/20120131/Ms7aZ6hL.jpg, я тоже хочу сделать патроны для сталкера.

Ссылка на комментарий
Поделиться на другие сайты

Найди адрес патронов. Поставь бряк на доступ. Выстрели и поищи инструкцию что на рисунке. Адрес инструкции может отличаться.

Желательно чтобы версия игры была той же что и в статье.

Ссылка на комментарий
Поделиться на другие сайты

я делаю так нахожу адрес http://s1.ipicture.ru/uploads/20120201/BCN5v0cU.jpg на доступ и инструкции http://s1.ipicture.ru/uploads/20120201/s21kCVr8.jpg, игра Stalker зов припяти, версия 1.6.00

Ссылка на комментарий
Поделиться на другие сайты

Насколько помню у меня получились бесконечные патроны таким способом только в Тени Чернобыля.
игра Stalker зов припяти, версия 1.6.00

Ramil Ты читать умеешь ?

Ссылка на комментарий
Поделиться на другие сайты

Andrey сам ввёл путаницу) В этой теме пишет про ТЧ, в статье речь идёт об ЗП 1.6... а не может так быть, что статья началась про ЗП, а закончилась ТЧ?)) Я пока тоже сижу разбираюсь с этой инструкцией...

Ссылка на комментарий
Поделиться на другие сайты

aliast вы имеет там инстукция от другого сталкера. А почему инструкция одна, потому что надо ставить бряк на запись и выстрелить, правильно ли.

Ссылка на комментарий
Поделиться на другие сайты

Andrey сам ввёл путаницу) В этой теме пишет про ТЧ, в статье речь идёт об ЗП 1.6... а не может так быть, что статья началась про ЗП, а закончилась ТЧ?)) Я пока тоже сижу разбираюсь с этой инструкцией...

Ой... я извиняюсь :ninja::lol: Я видимо очень спешил... Вообще я совершенно не помню как я писал ту статью. Я исследовал обе игры и кажется в одном документе. А потом всё кусками слепил. Ну вот и получилось, что получилось. Жаль... O-=

Так что я сам не помню что это ТЧ или ЗП.

Ссылка на комментарий
Поделиться на другие сайты

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

По идее не обязательно брать ИМЕННО ЭТУ инструкцию, расструктуризацию можно делать по любой другой, которая выскакивает при выстреле. Я ломал лицензию ТЧ без патчей (версию игры хз где посмотреть) все смещения сходятся: +57С патроны, +5С4 указатель с которым дальше работаем. На Зове Припяти с наскока подобный указатель не ищется, видимо движок игры изменили.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 года спустя...

В теме я публиковал ссылку на исходники. Я вытащил наиболее интересные классы в архиве
 


 





--------------
В архиве
_stl_extensions.h
Weapon.cpp
Weapon.h
WeaponMagazined.cpp
WeaponMagazined.h
 
Хотел сейчас составить наглядную схему как зависят классы между собой в динамическом списке, но мне надо на работу, увы не успел. Так же в планах показать связи цепочек указателей с данными классами, а также поиск цепочек указателей в трассировке CE, который я еще ни разу не показывал.

cpp stalker 1.6.rar

void CWeapon::SetAmmoElapsed(int ammo_count){	iAmmoElapsed				= ammo_count;	u32 uAmmo					= u32(iAmmoElapsed);	if (uAmmo != m_magazine.size())	{		if (uAmmo > m_magazine.size())		{			CCartridge			l_cartridge; 			l_cartridge.Load	(m_ammoTypes[m_ammoType].c_str(), m_ammoType);			while (uAmmo > m_magazine.size())				m_magazine.push_back(l_cartridge);		}		else		{			while (uAmmo < m_magazine.size())				m_magazine.pop_back();		};	};}
void CWeaponMagazined::ReloadMagazine() {	m_BriefInfo_CalcFrame = 0;		//устранить осечку при перезарядке	if(IsMisfire())	bMisfire = false;		if (!m_bLockType)	{		m_pCurrentAmmo		= NULL;	}		if (!m_pInventory) return;	if ( m_set_next_ammoType_on_reload != undefined_ammo_type )	{		m_ammoType						= m_set_next_ammoType_on_reload;		m_set_next_ammoType_on_reload	= undefined_ammo_type;	}		if(!unlimited_ammo()) 	{		if (m_ammoTypes.size() <= m_ammoType)			return;				LPCSTR tmp_sect_name = m_ammoTypes[m_ammoType].c_str();				if (!tmp_sect_name)			return;		//попытаться найти в инвентаре патроны текущего типа 		m_pCurrentAmmo = smart_cast<CWeaponAmmo*>(m_pInventory->GetAny(tmp_sect_name));				if(!m_pCurrentAmmo && !m_bLockType) 		{			for(u8 i = 0; i < u8(m_ammoTypes.size()); ++i) 			{				//проверить патроны всех подходящих типов				m_pCurrentAmmo = smart_cast<CWeaponAmmo*>(m_pInventory->GetAny( m_ammoTypes[i].c_str() ));				if(m_pCurrentAmmo) 				{ 					m_ammoType = i;					break; 				}			}		}	}	//нет патронов для перезарядки	if(!m_pCurrentAmmo && !unlimited_ammo() ) return;	//разрядить магазин, если загружаем патронами другого типа	if(!m_bLockType && !m_magazine.empty() && 		(!m_pCurrentAmmo || xr_strcmp(m_pCurrentAmmo->cNameSect(), 					 *m_magazine.back().m_ammoSect)))		UnloadMagazine();	VERIFY((u32)iAmmoElapsed == m_magazine.size());	if (m_DefaultCartridge.m_LocalAmmoType != m_ammoType)		m_DefaultCartridge.Load( m_ammoTypes[m_ammoType].c_str(), m_ammoType );	CCartridge l_cartridge = m_DefaultCartridge;	while(iAmmoElapsed < iMagazineSize)	{		if (!unlimited_ammo())		{			if (!m_pCurrentAmmo->Get(l_cartridge)) break;		}		++iAmmoElapsed;		l_cartridge.m_LocalAmmoType = m_ammoType;		m_magazine.push_back(l_cartridge);	}	VERIFY((u32)iAmmoElapsed == m_magazine.size());	//выкинуть коробку патронов, если она пустая	if(m_pCurrentAmmo && !m_pCurrentAmmo->m_boxCurr && OnServer()) 		m_pCurrentAmmo->SetDropManual(TRUE);	if(iMagazineSize > iAmmoElapsed) 	{ 		m_bLockType = true; 		ReloadMagazine(); 		m_bLockType = false; 	}	VERIFY((u32)iAmmoElapsed == m_magazine.size());}
void CWeaponMagazined::UnloadMagazine(bool spawn_ammo){	xr_map<LPCSTR, u16> l_ammo;		while(!m_magazine.empty()) 	{		CCartridge &l_cartridge = m_magazine.back();		xr_map<LPCSTR, u16>::iterator l_it;		for(l_it = l_ammo.begin(); l_ammo.end() != l_it; ++l_it) 		{			if(!xr_strcmp(*l_cartridge.m_ammoSect, l_it->first)) 			{ 				 ++(l_it->second); 				 break; 			}		}		if(l_it == l_ammo.end()) l_ammo[*l_cartridge.m_ammoSect] = 1;		m_magazine.pop_back(); 		--iAmmoElapsed;	}	VERIFY((u32)iAmmoElapsed == m_magazine.size());		if (!spawn_ammo)		return;	xr_map<LPCSTR, u16>::iterator l_it;	for(l_it = l_ammo.begin(); l_ammo.end() != l_it; ++l_it) 	{		if(m_pInventory)		{			CWeaponAmmo *l_pA = smart_cast<CWeaponAmmo*>(m_pInventory->GetAny(l_it->first));			if(l_pA) 			{				u16 l_free = l_pA->m_boxSize - l_pA->m_boxCurr;				l_pA->m_boxCurr = l_pA->m_boxCurr + (l_free < l_it->second ? l_free : l_it->second);				l_it->second = l_it->second - (l_free < l_it->second ? l_free : l_it->second);			}		}		if(l_it->second && !unlimited_ammo()) SpawnAmmo(l_it->second, l_it->first);	}}
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Как-то я наткнулся на видео школьника. 

 

1. Изменил счетчик патронов в памяти

2. Сохранился

3. Загрузился

 

После чего имел кучу патронов. Это же надо такое придумать.

Ссылка на комментарий
Поделиться на другие сайты

Как-то я наткнулся на видео школьника.

 

1. Изменил счетчик патронов в памяти

2. Сохранился

3. Загрузился

 

После чего имел кучу патронов. Это же надо такое придумать.

 

Хитро )

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.