• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, спешите принять участие в поэтическом конкурсе "Весенние поэты 2024"!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

Не стесняюсь спросить....

Локи

Участник форума
Регистрация
8 Янв 2011
Сообщения
529
Благодарности
20
Баллы
210
Какие программы использовать для создания своих модов на Возвращение*???*( если не тяжело киньте ссылку)
 

Ice

Участник форума
Регистрация
5 Ноя 2009
Сообщения
32
Благодарности
1
Баллы
160
У кого получилось отловить выстрел из лука? Откликнитесь!
1. Перехватить BS_AIMFAR не получается, ни с C_BodyStateContains ни без него:
PHP:
		var int bodystate;
		var string cT;
		cT=ConcatStrings("BS: ",IntToString(Npc_GetBodyState(hero)));
		//
		
		if(Npc_GetBodyState(hero)==BS_HIT){
			cT=ConcatStrings(cT,"BodyState is  BS_HIT "); 
		};
		//bodystate = (Npc_GetBodyState(hero) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS));
		if(Npc_GetBodyState(hero)==BS_AIMNEAR){
			cT=ConcatStrings(cT,"\nBodyState is  BS_AIMNEAR "); 
		};
		//bodystate = (Npc_GetBodyState(hero) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS));
		if(Npc_GetBodyState(hero)==BS_AIMFAR){
			cT=ConcatStrings(cT,"\nBodyState is  BS_AIMFAR "); 
		};
		if(Npc_GetBodyState(hero)==BS_ITEMINTERACT){
			cT=ConcatStrings(cT,"\nBodyState is  BS_ITEMINTERACT "); 
		};
		if(Npc_GetBodyState(hero)==BS_MOBINTERACT){
			cT=ConcatStrings(cT,"\nBodyState is  BS_MOBINTERACT "); 
		};
		if(Npc_GetBodyState(hero)==BS_MOBINTERACT_INTERRUPT){
			cT=ConcatStrings(cT,"\nBodyState is  BS_MOBINTERACT_INTERRUPT "); 
		};
		if(Npc_GetBodyState(hero)==BS_DROPITEM){
			cT=ConcatStrings(cT,"\nBodyState is  BS_DROPITEM "); 
		};
		if(Npc_GetBodyState(hero)==BS_THROWITEM){
			cT=ConcatStrings(cT,"\nBodyState is  BS_THROWITEM "); 
		};
		if(Npc_GetBodyState(hero)==BS_CASTING){
			cT=ConcatStrings(cT,"\nBodyState is  BS_CASTING "); 
		};
		if(Npc_GetBodyState(hero)==BS_CONTROLLING){
			cT=ConcatStrings(cT,"\nBodyState is  BS_CONTROLLING "); 
		};			
		print(cT);
с BodyStateContains()
PHP:
		if(C_BodyStateContains(hero,BS_HIT)){
			cT=ConcatStrings(cT,"BodyState is  BS_HIT "); 
		};
		if(C_BodyStateContains(hero,BS_AIMNEAR)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_AIMNEAR "); 
		};
		if(C_BodyStateContains(hero,S_AIMFAR)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_AIMFAR "); 
		};
		if(C_BodyStateContains(hero,BS_ITEMINTERACT)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_ITEMINTERACT "); 
		};
		if(C_BodyStateContains(hero,BS_MOBINTERACT)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_MOBINTERACT "); 
		};
		if(C_BodyStateContains(hero,BS_MOBINTERACT_INTERRUPT)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_MOBINTERACT_INTERRUPT "); 
		};
		if(C_BodyStateContains(hero,BS_DROPITEM)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_DROPITEM "); 
		};
		if(C_BodyStateContains(hero,BS_THROWITEM)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_THROWITEM "); 
		};
		if(C_BodyStateContains(hero,BS_CASTING)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_CASTING "); 
		};
		if(C_BodyStateContains(hero,BS_CONTROLLING)){
			cT=ConcatStrings(cT,"\nBodyState is  BS_CONTROLLING "); 
		};			
		print(cT);
Функция IntToString(Npc_GetBodyState(hero))
отлавливает бег, стоять, BS_HIT на BS_AIMFAR, BS_AIMNEAR возвращает пустое значение.
2. Математика bodystate = (Npc_GetBodyState(hero) & (BS_MAX | BS_FLAG_INTERRUPTABLE | BS_FLAG_FREEHANDS)); тоже результата не дала.

3. Добавление обработчиков к стреле и луку:
PHP:
instance ItRw_Arrow(C_Item)
{
...
	magic=arrowMagic;                    //(не используется)
on_state[0]=arrowOnStatZer;
on_state[1]=arrowOnStatOne;
on_state[2]=arrowOnStatTwo;
on_state[3]=arrowOnStatThr;//Функции вызываемые при использовании предмета по видам состояний (видов состояний не обнаружил ???)

};

instance ItRw_Sld_Bow(C_Item)
{
...
	magic=bowMagic;                    //(не используется)
on_state[0]=bowOnStatZer;
on_state[1]=bowOnStatOne;
on_state[2]=bowOnStatTwo;
on_state[3]=bowOnStatThr;//Фун
};

func void arrowMagic()
{
Print("Arrow magic");	
};

func void arrowOnStatZer(){
Print("Arrow on state Zero");	
};
func void arrowOnStatOne(){
Print("Arrow on state One");	
};
func void arrowOnStatTwo(){
Print("Arrow on state Two");		
};
func void arrowOnStatThr(){
Print("Arrow on state Three");		
};

func void bowMagic()
{
Print("Bow magic");	
};  

func void bowOnStatZer(){
Print("Bow on state Zero");	
};
func void bowOnStatOne(){
Print("Bow on state One");	
};
func void bowOnStatTwo(){
Print("Bow on state Two");		
};
func void bowOnStatThr(){
Print("Bow on state Three");		
};
Не сработало. Возможно функции обработчиков нужно определённым образом именовать?
Тогда как?

4. Функцию Npc_IsAiming() ещё не пробовал, т.к. всё таки нужен момент выстрела.

5. Есть ещё AI_AimAt(), AI_ShootAt()
Можно ли их использовать как аргумент Npc_IsInState() вообще и для обработки действий персонажа в частности? (понятно, что она для ZS_)

Прошу совета.:)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Ice, Ну у меня в моде реализовано следующим образом через зацикленный Триггер-Скрипт

Кусок скрипта с комментариями:

if(Npc_IsInFightMode(hero,FMODE_FAR))
{
if(Npc_GetTarget(hero)) //ГГ имеет цель
{
if(Npc_IsAiming(hero,other)) //ГГ прицеливается
{
B_PC_AimingTarget(TRUE); //Расчет наведения на цель
}
else
{
B_PC_AimingTarget(FALSE); //Потеря наведения на цель
};
B_InitFightSkills(hero);
}
else
{
PC_AIM_PERCENT = FALSE; //Сброс прицела.
};
 

Jr13San


Модостроитель
Регистрация
1 Апр 2010
Сообщения
435
Благодарности
261
Баллы
230
Ice, первый вопрос - это выстрел из лука от кого? От главного персонажа или от всех окружающих его NPC?
Далее...
Не знаю, может быть это и хитро придумано, но можно попробовать так:
Но это отслеживание выстрела чисто от ГГ.
Вся фишка в том, чтобы отследить изменение кол-ва стрел(если надо, допиши болты или другие боеприпасы)

Код:
Код:
func void QAmmo()//функция, отслеживающая изменение кол-ва стрел у ГГ
{
	var int QArrows;
	
	if Npc_IsInFightMode(hero,FMODE_FAR) == 1 //если ГГ находится в боевом режиме с оружием дальнего радиуса поражения
	{
		//следим за кол-вом стрел
		
		if (QArrows == 0) && (Npc_HasItems(hero,ItRw_Arrow) > 0) //начальное значение надо записать. А если стрелы закончатся?
		{
			QArrows = Npc_HasItems(hero,ItRw_Arrow);
		}
		else
		{
			if (QArrows > Npc_HasItems(hero,ItRw_Arrow))//если стрел стало меньше
			{
				Print("Выстрел!");//произошёл выстрел
				QArrows = Npc_HasItems(hero,ItRw_Arrow);//записываем новое значение стрел в переменную QArrows
			};
		};
	};
};

Возможны баги и ошибки, т.к. функция не прошла теста.
Надо исправить баги:
1) при переходе в боевой режим отладить сообщение выстрела.
2) Последняя стрела не отслеживается. Надо откорректировать и отследить её выстрел.

Функцию надо вызывать из таймера(скрипт + триггер) или через обычный цикл, в котором находится НПС.
Пример:
Код:
func void ZS_SanUse()
{
};

func int ZS_SanUse_Loop()
{
	QAmmo();
	return LOOP_CONTINUE;
};

func void ZS_SanUse_End()
{
};
Осталось ввести в цикл любого нпс и вставть его в локацию.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
Ice, первый вопрос - это выстрел из лука от кого? От главного персонажа или от всех окружающих его NPC?
Далее...
Не знаю, может быть это и хитро придумано, но можно попробовать так:
Но это отслеживание выстрела чисто от ГГ.
Вся фишка в том, чтобы отследить изменение кол-ва стрел(если надо, допиши болты или другие боеприпасы)

Код:
Код:
func void QAmmo()//функция, отслеживающая изменение кол-ва стрел у ГГ
{
	var int QArrows;
	
	if Npc_IsInFightMode(hero,FMODE_FAR) == 1 //если ГГ находится в боевом режиме с оружием дальнего радиуса поражения
	{
		//следим за кол-вом стрел
		
		if (QArrows == 0) && (Npc_HasItems(hero,ItRw_Arrow) > 0) //начальное значение надо записать. А если стрелы закончатся?
		{
			QArrows = Npc_HasItems(hero,ItRw_Arrow);
		}
		else
		{
			if (QArrows > Npc_HasItems(hero,ItRw_Arrow))//если стрел стало меньше
			{
				Print("Выстрел!");//произошёл выстрел
				QArrows = Npc_HasItems(hero,ItRw_Arrow);//записываем новое значение стрел в переменную QArrows
			};
		};
	};
};

Возможны баги и ошибки, т.к. функция не прошла теста.
Функцию надо вызывать из таймера(скрипт + триггер) или через обычный цикл, в котором находится НПС.
Пример:
Код:
func void ZS_SanUse()
{
};

func int ZS_SanUse_Loop()
{
	QAmmo();
	return LOOP_CONTINUE;
};

func void ZS_SanUse_End()
{
};
Осталось ввести в цикл любого нпс и вставть его в локацию.
Ты не врубился=) Он имелл в виду КАК отследить
const int BS_AIMNEAR = 24; //Близкая цель
const int BS_AIMFAR = 25; //Далекая цель
const int BS_HIT = 26 | BS_FLAG_INTERRUPTABLE; //Удар
Эти состояния тела гг) допустим чем дольше целишсо, тем выше дамаг идет от Рейнж вепона;)
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
У меня тоже схема похожая на Myxomop,
if(Npc_IsInFightMode(hero,FMODE_FAR) && Npc_GetTarget(hero))
в циклическом триггере только без прицеливания - нет у меня зависимости урона от времени натяжения, да и сам процесс натяжения (прицеливания) длится очень недолго. По другому тоже не смог отловить ни момент выстрела из лука, ни момент попадания стрелы в цель (если только через цикл на состояние ХП цели, но это непозволительная роскошь). Фактически получается что если ГГ бежит с луком на изготовку, то с автозахватом цели автоматически и целится. А вот отловить сам момент выстрела через встроенные состояния не получилось.
 

Ice

Участник форума
Регистрация
5 Ноя 2009
Сообщения
32
Благодарности
1
Баллы
160
Спасибо большое Myxomop, Saturas, Dimmell
за ответы и рекомендации.
Вариант предложеный Myxomop наиболее близок к цели. Проверено - хорошо работает. Натяжение тетивы - потребляет выносливость.
Сам выстрел планирую обрабатыать в другом обработчике.
Получается следующее:
Триггер функция вызывает -> b_everySecond() каждую секунду, из неё вызываются различные обработчики
PHP:
//==========================================================================
//						calcStaminaInFight()	
//
// Определить расход выносливости в бою
//  в зависимости от аттрибутов персонажа
// 
func void calcStaminaInFight()	
{
	// Если ГГ в режиме боя любом то
	if(Npc_IsInFightMode(hero,FMODE_NONE)!=TRUE)
	{
		// сразу вычесть из выносливости
		ATR_STAMINA -= 1;
		
		//если нанесён механический удар 
		if(C_BodyStateContains(hero,BS_HIT)) 
		{		
			//ручным оружием
			if(Npc_IsInFightMode(hero,FMODE_MELEE)) 
			{
				ATR_STAMINA -= getRequiredStamina(ATR_STRENGTH)*2;
				
			}// иначе кулаком
			else	
			{ 
				ATR_STAMINA -= 3;
			};
			
		}// если дальнобой
		else if(Npc_IsInFightMode(hero,FMODE_FAR))
		{
			//TODO и ГГ имеет цель
			if(Npc_GetTarget(hero)) 
			{
				//и ГГ прицеливается
				if(Npc_IsAiming(hero,other)) 
				{
					// вычитаем в зависимости от оружия
					ATR_STAMINA -= getRequiredStamina(ATR_DEXTERITY)*2;
				};
			};
			
		}// если магия
		else if(Npc_IsInFightMode(hero,FMODE_MAGIC))
		{
			// вычтем удвоенное количество уровня заклинания
			ATR_STAMINA -= Npc_GetActiveSpellLevel(hero)*2;
		};
		
		//* DEBUG
		printDbg("Стамина Лук " ,ATR_STAMINA);
		// */

		// Если выносливость упала НИЖЕ нуля то страдает  зоровье
		checkStamina();
		
		//Проверим, не помер ли ГГ
		checkDeath();
		
	};
};

 //Функции вызываемые каждую секунду
b_everySecond()
{
 //...

   // Подсчитать расход выносливости в бою
   calcStaminaInFight();	

 //...

}
Вспомогательные функции
PHP:
//=============================================================
//           		  addSymbolsAtLeft()
//
//  Позволяет получить строку заполненную count раз, переданным  
//   в параметре символом и оканчивающуюся переданной 
//   в параметре строкой.
//   addSymbolsAtLeft("Endstring", "=",4) -> ====Endstring
//  .
// string str - завершающая строка. Выводится всегда! "Endstring"
// string marker - заполняющий символ					"="
// int count - сколько раз повторить маркер в строке	"4"
//
//-------------------------------------------------------------
// Возвращает строку: ====Endstring

func string addSymbolsAtLeft(var string str, var string marker, var int count)
{
	if(count <= 0) {return str;};
	count-=1;
	return ConcatStrings(marker,addSymbolsAtLeft(str, marker, count));
};

//=============================================================
//                      formatNuber()
//
// !!! Максимально обрабатываемое число 6 символов (999999)
// Достраивает число до нужного разряда добавлением символов слева
//  1 -> 001 или 1-> __1
// 
//  при привышении, число выводится как есть
// 
// int number 		- Число само положительное
// int length 		- какой длинны должно получится итоговое число
// string marker	- маркер добавляемы слева
// -------------------------------------------------------------------
// Возвращает строку: formatNuber(88, 4, _)->"__88"
//

 func string  formatNuber(var int number, var int length, var string marker)
{
	// Если Лимит возможностей функции превышен > 6 символов
	// число выводится строкой без модификации
	if(number>=1000000){
		return IntToString(number);
	};
	
	var int razr;			// сколько 
	
	// опредедить из скольки разрядов состоит число
	if(number < 10)
	{
		razr=1;
	}
	else if(number < 100)
	{
		razr=2;
	}
	else if(number < 1000)
	{
		razr=3;
	}
	else if(number < 10000)
	{
		razr=4;
	}
	else if(number < 100000)
	{
		razr=5;
	}
	else if(number < 1000000) //число из 6 символов
	{
		razr=6;
	};
	
	// Если число разрядов равно длинне получаемого числа то
	if(razr == length){
		return IntToString(number);
	};
	
	// Дополнить число слева маркером
	return addSymbolsAtLeft(IntToString(number), marker, length-razr);
};

// ==========================================================
//					printDbg()
//
// Функция циклического вывода дебаг информации на экран
// высотой 20 строк на 19 секунд каждая
// string meesage 		- Строка сообщения
// int value			- значение
//
var int y_incr;
func void printDbg(var string meesage, var int value)
{
	if(value<0){value=0;};
	if(y_incr > 20){y_incr=0;};
	PrintScreen(ConcatStrings(meesage,formatNuber(value,5," ")),10,10+y_incr*3,FONT_ScreenSmall,19);
	y_incr+=1;
};
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Ice,
оно работает, но есть одно игрово-читерское но :)
Если стать и зажать кнопку мыши при стрельбе из лука или закликивать мышью - триггер с частотой раз в 1сек не будет успевать обрабатывать все выстрелы и все удары оружием, т.е часть их пройдет без расхода выносливости. Проверено. :)
Если ГГ бежит (или идет) с луком в руках в пределах прицеливания (но не хочет стрелять), как поведет себя обработчик?
 

Ice

Участник форума
Регистрация
5 Ноя 2009
Сообщения
32
Благодарности
1
Баллы
160
Dimmell спасибо за замечание.
Работает ли вообще BS_AIMFAR не ясно, а по логике, был бы лучшим решением.
По поводу закликивания. Запустив DEBUG обнаружилось, что действительно, ежесекундный интервал обрабатывается неверно! Можно попробовать ввести дополнительные проверки... К счастью, борьба с читерством не является моей целью.
Melle превосходно срабатывает(BS_HIT - работает).
Пока придётся остановиться на этом.
При беге и стоя с оружием - всё пучком:
Стоим + 1к выносливости.
Бежим -1 к выносливости.
Без оружия +2 к выносливости и т.д.
Триггер планирую перенастроить на 300 милесекунд.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Ice,
Триггер планирую перенастроить на 300 милесекунд.
Я поставил на 1/10 секунды. Также в связке с триггером выстрел регистрируется при попадании стрелы в жертву - сбрасывается прицел, закликивание не прокатит :)
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Myxomop,
Если бы еще убить полностью автоприцел - было бы вообще классно! :)
ЗЫ. после "сбивания" прицела приходится поворачиваться к цели для наведения?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Dimmell,
Я имел ввиду силу натяжения тетивы лука. После попадания стрелы в жертву сила натяжения сбрасывается. При закликивании нет достаточного натяжения тетивы, а соответственно и нет урона от стрелы, т.е. выстрелы проходят в холостую не причиняя особого вреда жертве. На видеороликах мода отображается индикатор натяжения.
 

Grakkoff

Участник форума
Регистрация
27 Фев 2011
Сообщения
11
Благодарности
0
Баллы
150
Хочется выдернуть меню из G3.
какой программой и из какого файла можно выдернуть?
 

Grakkoff

Участник форума
Регистрация
27 Фев 2011
Сообщения
11
Благодарности
0
Баллы
150
Spielmann
Главное меню, в котором пункты начать игру, настройки и т.д.
картинку хочу выдернуть и поставить на рабочий стол.
 

Saturas


Модостроитель
Регистрация
11 Фев 2009
Сообщения
2.512
Благодарности
1.332
Баллы
315
А зачем сюда писать? Есть гугл какбэ, и там есть ВСЕ что нужно если поискать..

..... написал(а):
яж гуарыл, план Аллена Даллеса в действии...
 

Grakkoff

Участник форума
Регистрация
27 Фев 2011
Сообщения
11
Благодарности
0
Баллы
150
Я искал, но так и не нашёл чем открывать .m01 и .mod файлы.
нашёл только для 1 и 2 частей.
 

Grakkoff

Участник форума
Регистрация
27 Фев 2011
Сообщения
11
Благодарности
0
Баллы
150
Saturas
Да. версия 1.74
 
Сверху Снизу