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

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

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

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.371
Благодарности
7.803
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 511
Последнее редактирование модератором:

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Dimus, наверно, если ты подойдёшь первым к Кавалорну, то украдёшь у него, а у Бартока после этого нет. ;)
 

Ur-tRall

Участник форума
Регистрация
16 Май 2009
Сообщения
4.102
Благодарности
2.122
Баллы
475
Говоришь вместо предмета пишет (). Значит по идее предмета нет в его инвентаре, так как прошла неправильно компиляция. Изначально инстанция имела численное значение или название предмета? Ничего в файл функций не добавлял случаем? По идее у тебя произошло смешение инстанций на несколько пунктов (думаю что на 2) и видимо предмет записался как название в func. Надо тогда всё перепроверять . И если проект был скомпилирован при других значениях в файле RedefinedFunc.d. Я бы попробовал зайти в файл RedefinedFunc.d и вести строку на преобразование инстанции в интеджер при воровстве. Сталкивался с похожей проблемой.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Dimus,
а у второго украденные стрелы почему-то не попадают в инвентарь ГГ и показывается надпись: 44 предметов получено ().
зачем их вообще прописывать одному, а потом передавать другому? *???*
прописали:
CreateInvItems(other,ItRw_Arrow,40); (или CreateInvItems(hero,ItRw_Arrow,40);)
следом добавили строку с PrintScreen"Украдено 40 стрел" и усё...
И ни в какой инвентарь торговца они не попадут.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
Я уже проверял - последовательность кражи стрел не даёт никакого эффекта. У Бартока это работает всегда, а у Кавалорна - фигвам. И я ничего не изменял в RedefinedFunc.
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Dimus, ладно, тогда поясню сразу. Не надо обращаться к инстанции по ссылке на ID, ибо у каждого экземпляра свой ID в мире.
 

Хелдар

Участник форума
Регистрация
3 Июл 2012
Сообщения
2.449
Благодарности
779
Баллы
375
В Спейсере после нескольких секунд работы FPS=1000, все провисает. Как это можно исправить?
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Хелдар,
Тут глянь.
З.Ы. Причем здесь скриптинг?
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
Очередная порция вопросов к знатокам скриптинга:
1. Во время спора с Родом я не могу заставить ГГ правильно экипироваться именно его мечом, а не наилучшим оружием ближнего боя. Попытки замены функции AI_EquipBestMeleeWeapon(other); другими функциями приводят к глюкам: при использовании функции EqiupItem(other,ItMw_2H_Rod); меч остаётся за спиной ГГ, а он переходит в режим кулачного боя, а при использовании функции Npc_SetToFightMode(other,ItMw_2H_Rod); ГГ берёт его как одноручник и не может использовать в бою. Вдобавок в обоих случаях в инвентаре ГГ появляется второй экземпляр меча Рода. Неужели придётся на время состязания удалять из инвентаря ГГ оружие с большим повреждением, чем меч Рода (повреждение 40, сила 30)?*???*
2. Не получается заставить магов и паладинов лечить себя с помощью магии в скрипте ZS_HealSelf.d:
Код:
func void ZS_HealSelf()
{
	Perception_Set_Minimal();
};

func int ZS_HealSelf_Loop()
{
	if(self.attribute[ATR_HITPOINTS] == self.attribute[ATR_HITPOINTS_MAX])
	{
		Npc_ClearAIQueue(self);
		return LOOP_END;
	};
	if((self.guild == GIL_KDF) || (self.aivar[AIV_MagicUser] == MAGIC_ALWAYS))
	{
		if(Npc_HasItems(self,ItRu_FullHeal) == 0)
		{
			CreateInvItems(self,ItRu_FullHeal,1);
		};
		AI_ReadySpell(self,SPL_FullHeal,SPL_Cost_FullHeal);
		return LOOP_CONTINUE;
	}
	else if(self.guild == GIL_PAL)
	{
		if(Npc_HasItems(self,ItRu_PalFullHeal) == 0)
		{
			CreateInvItems(self,ItRu_PalFullHeal,1);
		};
		AI_ReadySpell(self,SPL_PalFullHeal,SPL_Cost_PalFullHeal);
		return LOOP_CONTINUE;
	}	
	else if(Npc_HasItems(self,ItPo_Health_03) > 0)
	{
		AI_UseItem(self,ItPo_Health_03);
		return LOOP_CONTINUE;
	}
	else if(Npc_HasItems(self,ItPo_Health_02) > 0)
	{
		AI_UseItem(self,ItPo_Health_02);
		return LOOP_CONTINUE;
	}
	else if(Npc_HasItems(self,ItPo_Health_01) > 0)
	{
		AI_UseItem(self,ItPo_Health_01);
		return LOOP_CONTINUE;
	}
	else if(Npc_GetInvItemBySlot(self,INV_FOOD,1) > 0)
	{
		AI_UseItem(self,item);
		return LOOP_CONTINUE;
	}
	else
	{
		Npc_ClearAIQueue(self);
		return LOOP_END;
	};
};

func void ZS_HealSelf_End()
{
};
Сначала я пробовал воспользоваться функцией AI_UseItem(), но она не срабатывает для рун. В данный момент маги и палы только стоят с активированным заклинанием, но при этом не лечат себя. Пожалуйста подскажите выход из этого тупика.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Dimus,
1. Кажется встречал упоминание на немецком воге при помощи Икаруса, ИМХО по другому не получится.
2. смотри здесь AI\Magic\B_SelectSpell.d
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
Myxomop,
1. Если это можно сделать только с помощью скриптпакета Ikarus, тогда к Белиару такое решение.=(
2. Я в первую очередь изучал этот скрипт. Но дело в том, что в нём только выбирается закл, который будет использован магом/палом в состоянии атаки. Может, лучше попробовать имитировать действие заклинания лечения, т.е. показать анимацию лечения магией (какую именно?) и увеличить значение атрибута ATR_HITPOINTS кастера?:-\

Да, имитация действия заклинания работает:
Код:
func void ZS_HealSelf()
{
	Perception_Set_Minimal();
};

func int ZS_HealSelf_Loop()
{
	if(self.attribute[ATR_HITPOINTS] == self.attribute[ATR_HITPOINTS_MAX])
	{
		return LOOP_END;
	};
	if((self.guild == GIL_KDF) || (self.guild == GIL_KDW) || (self.aivar[AIV_MagicUser] == MAGIC_ALWAYS))
	{
		if(self.attribute[ATR_MANA] >= SPL_Cost_FullHeal)
		{
			AI_PlayAni(self,"T_MAGRUN_2_HEASHOOT");
			Wld_PlayEffect("spellFX_Heal_ORIGIN",self,self,0,0,0,FALSE); 
			self.attribute[ATR_MANA] -= SPL_Cost_FullHeal;
			Npc_ChangeAttribute(self,ATR_HITPOINTS,SPL_Heal_FullHeal);
			return LOOP_CONTINUE;
		};
	}
	else if(self.guild == GIL_PAL)
	{
		if(self.attribute[ATR_MANA] >= SPL_Cost_PalFullHeal)
		{
			AI_PlayAni(self,"T_MAGRUN_2_HEASHOOT");
			Wld_PlayEffect("spellFX_PalHeal_ORIGIN",self,self,0,0,0,FALSE); 
			self.attribute[ATR_MANA] -= SPL_Cost_PalFullHeal;
			Npc_ChangeAttribute(self,ATR_HITPOINTS,SPL_Heal_PalFullHeal);
			return LOOP_CONTINUE;
		};
	}	
	else if(Npc_HasItems(self,ItPo_Health_03) > 0)
	{
		AI_UseItem(self,ItPo_Health_03);
		return LOOP_CONTINUE;
	}
	else if(Npc_HasItems(self,ItPo_Health_02) > 0)
	{
		AI_UseItem(self,ItPo_Health_02);
		return LOOP_CONTINUE;
	}
	else if(Npc_HasItems(self,ItPo_Health_01) > 0)
	{
		AI_UseItem(self,ItPo_Health_01);
		return LOOP_CONTINUE;
	}
	else
	{
		return LOOP_END;
	};
};

func void ZS_HealSelf_End()
{
	Npc_ClearAIQueue(self);
};
P.S.: Спасибо Мухомору за название эффекта лечебного заклинания у магов.

P.P.S.: Пришлось убрать самолечение NPC с помощью еды, т.к. это приводило к глюку ИИ: у побитого NPC заканчивались целебные зелья и еда, но он не выходил из цикла самолечения до тех пор, пока ГГ не уходил достаточно далеко, чтобы у него восстановилось здоровье.
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
К сожалению, пока мне не удалось подобрать эффект, соответствующий заклинанию лечения у магов (у палов всё работает как надо).
Вероятно Wld_PlayEffect("spellFX_Heal_ORIGIN",self,self,0,0,0,FALSE);
VisualFxInst.d
 

Bjorn++

Участник форума
Регистрация
28 Июн 2011
Сообщения
1.063
Благодарности
46
Баллы
235
Как восстановить бонус на жизнь за получении каждого уровня?
И как восстановить героические бонусы?
Готика 2 Возвращение Ребаланс!
 

Test Level

Участник форума
Регистрация
1 Ноя 2011
Сообщения
1.771
Благодарности
557
Баллы
275
Извините, понимаю, что вопрос нубский, но очень уж хочется разобраться.

Вопрос такой. Я в IT_Addon_Belts.d прописал защитному поясу
Код:
effect = "SPELLFX_FIREBOW";
Когда пояс лежит на земле, эффект работает, как только оказывается надетым на ГГ, пропадает. Можно сделать так, чтоб эффект был и при экипированном на ГГ поясе?

И ещё вопрос. Где прописывается такая вещь, как реакция монстров на ГГ. (В Ребалансе 2.1 они, при достижении определённого уровня силы, начинают разбегаться)?
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Begemot666,
1) Пояс не надевается на тело, можешь наложить на ГГ эффект на нужный слот/кость в форме круга, но думаю, тебе ещё рано баловать с PFX-VisualFX скриптами.
2) B_MM_AssessPlayer
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.204
Благодарности
6.180
Баллы
1.565
Извините, понимаю, что вопрос нубский, но очень уж хочется разобраться.

Вопрос такой. Я в IT_Addon_Belts.d прописал защитному поясу
Код:
effect = "SPELLFX_FIREBOW";
Когда пояс лежит на земле, эффект работает, как только оказывается надетым на ГГ, пропадает. Можно сделать так, чтоб эффект был и при экипированном на ГГ поясе?

И ещё вопрос. Где прописывается такая вещь, как реакция монстров на ГГ. (В Ребалансе 2.1 они, при достижении определённого уровня силы, начинают разбегаться)?
Пояс не отображается на неписи, хоть на ГГ хоть на ком другом. Это просто как дополнительная инстанция, так сказать... по этому и эффекта не видно.

Можно сделать немного по другому
например вот твой пояс:
instance ItBe_TVOJ_POYAS(C_Item)
{
name = NAME_Addon_Belt;
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_BELT | ITEM_MULTI;
value = Value_ItBE_Addon_Prot_Total;
visual = "ItMi_Belt_02.3ds";
visual_skin = 0;
material = MAT_METAL;
description = "Пояс";
text[1] = NAME_Prot_Edge;
count[1] = BeltBonus_ProtTotal;
text[2] = NAME_Prot_Point;
count[2] = BeltBonus_ProtTotal;
text[3] = NAME_Prot_Magic;
count[3] = BeltBonus_ProtTotal;
text[4] = NAME_Prot_Fire;
count[4] = BeltBonus_ProtTotal;
text[5] = NAME_Value;
count[5] = value;
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
inv_rotx = INVCAM_ENTF_MISC2_STANDARD;
};
дабавляем в него 2 строчки:
on_equip = Equip_ItBe_TVOJ_POYAS;
on_unequip = UnEquip_ItBe_TVOJ_POYAS;
чеб выглядело примерно так:
instance ItBe_TVOJ_POYAS(C_Item)
{
name = NAME_Addon_Belt;
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_BELT | ITEM_MULTI;
value = Value_ItBE_Addon_Prot_Total;
visual = "ItMi_Belt_02.3ds";
visual_skin = 0;
material = MAT_METAL;
description = "Пояс";
on_equip = Equip_ItBe_TVOJ_POYAS;
on_unequip = UnEquip_ItBe_TVOJ_POYAS;

text[1] = NAME_Prot_Edge;
count[1] = BeltBonus_ProtTotal;
text[2] = NAME_Prot_Point;
count[2] = BeltBonus_ProtTotal;
text[3] = NAME_Prot_Magic;
count[3] = BeltBonus_ProtTotal;
text[4] = NAME_Prot_Fire;
count[4] = BeltBonus_ProtTotal;
text[5] = NAME_Value;
count[5] = value;
inv_zbias = INVCAM_ENTF_AMULETTE_STANDARD;
inv_rotx = INVCAM_ENTF_MISC2_STANDARD;
};
дальше пишем функции: Equip_ItBe_TVOJ_POYAS и UnEquip_ItBe_TVOJ_POYAS чтоб в этих функциях включался и соответсвенно выключался эффект при одевании\снимании на середине тела.
к сожалению счас нет под рукой какого-либо 3д редактора. так бы посмотрел... но может кто еще подскажет что конкретно писать в этих фенкциях...

ЗЫ. просто в голову пришло попробуй такие функции прописатью:
func void Equip_ItBe_TVOJ_POYAS()
{
self.effect = "SPELLFX_FIREBOW";
};
func void UnEquip_ItBe_TVOJ_POYAS()
{
self.effect = "";
};
убирание эффекта врятли сработает.... если вообще что-то сработает)))
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
Очередной вопрос знатокам скриптинга. Вас не удивляет, что заключённые в городской тюрьме носят оружие? Неужели ополчение Хориниса не в состоянии разоружить арестованных? Я попробовал сделать это с помощью скриптов, перед отправкой в тюрьму удаляя из инвентаря надетое оружие функцией B_ClearJailedNPC(self), но столкнулся с проблемами: если в инвентаре заключённого есть другое оружие, то при угрозе оружием или нападении он обязательно экипируется им, причём игнорируются принудительный перевод NPC в режим кулачного боя (функция SetToFistMode(self)) или запрет на атаку (self.aivar[AIV_NoFightParker] = TRUE).
скрипт Story\B_Story\B_ClearDeadTrader.d:
Код:
func void B_ClearDeadTrader(var C_Npc Trader)
{
	Npc_ClearInventory(Trader);
	if(Trader.aivar[AIV_VictoryXPGiven] == FALSE)
	{
		B_CreateAmbientInv(Trader);
	};
	Trader.aivar[AIV_ChapterInv] = Kapitel - 1;
};

func void B_ClearJailedNpc(var C_Npc slf)
{
	var C_Item Weapon;
	if(Npc_HasEquippedMeleeWeapon(slf))
	{
		Weapon = Npc_GetEquippedMeleeWeapon(slf);
		Npc_RemoveInvItem(slf,Hlp_GetInstanceID(Weapon));
	};
	if(Npc_HasEquippedRangedWeapon(slf))
	{
		Weapon = Npc_GetEquippedRangedWeapon(slf);
		Npc_RemoveInvItem(slf,Hlp_GetInstanceID(Weapon));
	};
};
Примеры отправки в тюрьму NPC в скрипте Story\Dialoge\DIA_MIL_311_Andre.d:
Код:
func void DIA_Andre_Auslieferung_Rengaru()
{
	AI_Teleport(Rengaru,"NW_CITY_HABOUR_KASERN_RENGARU");
	AI_Output(other,self,"DIA_Andre_Auslieferung_Rengaru_15_00");	//Ренгару украл у торговца Джоры. Он пытался скрыться, но я поймал его.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Rengaru_08_01");	//Хорошо, мои люди уже схватили его. Больше он не сможет воровать у добропорядочных граждан.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Rengaru_08_02");	//Вот твои деньги.
	B_GiveInvItems(self,other,ItMi_Gold,Kopfgeld);
	B_ClearJailedNpc(Rengaru);
	B_StartOtherRoutine(Rengaru,"PRISON");
	Rengaru_Ausgeliefert = TRUE;
	MIS_ThiefGuild_sucked = TRUE;
	B_GivePlayerXP(XP_Andre_Auslieferung);
	Info_ClearChoices(DIA_Andre_Auslieferung);
};

func void DIA_Andre_Auslieferung_Halvor()
{
	AI_Teleport(Halvor,"NW_CITY_HABOUR_KASERN_HALVOR");
	AI_Output(other,self,"DIA_Andre_Auslieferung_Halvor_15_00");	//Халвор торгует краденым. Он продает товары, украденные бандитами у торговцев.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Halvor_08_01");	//Так вот, кто этим занимается. Мои люди немедленно схватят его.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Halvor_08_02");	//Я не думаю, что это будет сложно. Я готов вручить тебе твою награду прямо сейчас.
	B_GiveInvItems(self,other,ItMi_Gold,Kopfgeld);
	B_ClearJailedNpc(Halvor);
	B_StartOtherRoutine(Halvor,"PRISON");
	MIS_ThiefGuild_sucked = TRUE;
	Halvor_Ausgeliefert = TRUE;
	B_GivePlayerXP(XP_Andre_Auslieferung);
	Info_ClearChoices(DIA_Andre_Auslieferung);
};

func void DIA_Andre_Auslieferung_Nagur()
{
	AI_Teleport(Nagur,"NW_CITY_HABOUR_KASERN_NAGUR");
	AI_Output(other,self,"DIA_Andre_Auslieferung_Nagur_15_00");	//Нагур убил посыльного Бальтрама. Он пытался использовать меня в качестве нового посыльного, чтобы перехватить товар с фермы Акила.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Nagur_08_01");	//Он понесет заслуженное наказание. Я немедленно прикажу посадить его за решетку.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Nagur_08_02");	//Вот, получи награду. Ты ее заслужил.
	B_GiveInvItems(self,other,ItMi_Gold,Kopfgeld);
	B_ClearJailedNpc(Nagur);
	B_StartOtherRoutine(Nagur,"PRISON");
	MIS_ThiefGuild_sucked = TRUE;
	Nagur_Ausgeliefert = TRUE;
	B_GivePlayerXP(XP_Andre_Auslieferung);
	Info_ClearChoices(DIA_Andre_Auslieferung);
};

func void DIA_Andre_Auslieferung_Canthar()
{
	AI_Teleport(Canthar,"NW_CITY_HABOUR_KASERN_RENGARU");
	AI_Output(other,self,"DIA_Andre_Auslieferung_Canthar_15_00");	//Торговец Кантар пытается избавиться от Сары!
	AI_Output(self,other,"DIA_Andre_Auslieferung_Canthar_08_01");	//Сары? Торговки оружием с рыночной площади?
	AI_Output(other,self,"DIA_Andre_Auslieferung_Canthar_15_02");	//Я должен был подсунуть Саре письмо, которое подтвердило бы, что она поставляет оружие Онару.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Canthar_08_03");	//Понимаю. Я с радостью заплачу награду за этого ублюдка. Можешь считать, что он уже за решеткой.
	B_GiveInvItems(self,other,ItMi_Gold,Kopfgeld);
	B_ClearJailedNpc(Canthar);
	B_StartOtherRoutine(Canthar,"KNAST");
	MIS_Canthars_KomproBrief = LOG_FAILED;
	B_CheckLog();
	Canthar_Ausgeliefert = TRUE;
	B_GivePlayerXP(XP_Andre_Auslieferung);
	Info_ClearChoices(DIA_Andre_Auslieferung);
};

func void DIA_Andre_Auslieferung_Sarah()
{
	AI_Teleport(Sarah,"NW_CITY_HABOUR_KASERN_RENGARU");
	AI_Teleport(Canthar,"NW_CITY_SARAH");
	AI_Output(other,self,"DIA_Andre_Auslieferung_Sarah_15_00");	//Сара продает оружие Онару.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Sarah_08_01");	//Сара? Торговка оружием с рыночной площади? У тебя есть доказательство?
	AI_Output(other,self,"DIA_Andre_Auslieferung_Sarah_15_02");	//В ее кармане письмо с деталями поставки оружия ему.
	AI_Output(self,other,"DIA_Andre_Auslieferung_Sarah_08_03");	//Она поплатится за это. Я прикажу арестовать ее.
	B_GiveInvItems(self,other,ItMi_Gold,Kopfgeld);
	B_ClearJailedNpc(Sarah);
	B_StartOtherRoutine(Sarah,"KNAST");
	B_StartOtherRoutine(Canthar,"MARKTSTAND");
	Sarah_Ausgeliefert = TRUE;
	MIS_Canthars_KomproBrief = LOG_SUCCESS;
	B_GivePlayerXP(XP_Andre_Auslieferung);
	Info_ClearChoices(DIA_Andre_Auslieferung);
};
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
Забавно, тоже вчера сочинял аналогичную функцию. Для Г1. Но если неписи остаются живыми, то изъятие экипированного оружия ничего не даст без полной очистки инвентаря от оружия. Оружие из инвентаря экипируется автоматически при попадании непися в зону действия ИИ. Впрочем, экипировке стрелкового оружия может помешать изъятие стрел и болтов.

Кстати, а нельзя ли временно, на период заключения, понижать силу и ловкость неписей, чтобы они не могли экипироваться ни одним из видов оружия?
 

redleha


Модостроитель
Регистрация
26 Фев 2008
Сообщения
735
Благодарности
665
Баллы
245
Товарищи, не проще полностью очистить инвентарь? Деэкипируете и удаляете всё, что есть.
Чтобы НПС не реагировал на оружие или повреждения - есть функции восприятия:
B_AssessDamage, B_AssessMagic, B_AssessDrawWeapon
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.562
Благодарности
4.154
Баллы
915
Полная очистка от оружия инвентаря арестованного - не выход, учитывая следующие факторы:
- с учётом большого набора различного оружия в игре функция очистки получится просто огромной;
- пара персонажей по сюжету выходят из тюрьмы в главе 3: торговец оружием Кантар (если ГГ посадил его в главе 1) и ложно обвинённый в убийстве паладина Лотара кузнец Беннет, который также продаёт оружие. Следовательно, после освобождения им нужно восстанавливать весь ассортимент товаров с 1-й по 3-ю главы, включая и предметы, которые продал им ГГ.

А вот идею со временным понижением силы и ловкости можно попробовать, т.к. исходные значения запоминаются в переменных aivar[REAL_STRENGTH] и aivar[REAL_DEXTERITY]. Кстати, а что делать в случае, если арестован маг? Уменьшать ему максимальную ману до нуля или прописать в aivar[AIV_MagicUser] = MAGIC_NEVER?

Похоже, что эта идея оказалась рабочей и в результате я заставил заключённых отказаться от привычки носить оружие в тюрьме - смотрите скрипт Story\B_Story\B_NpcIsJailed.d:
Код:
func void B_UnequipWeapons(var C_Npc slf)
{
	var C_Item Weapon;
	if(Npc_HasEquippedMeleeWeapon(slf))
	{
		Weapon = Npc_GetEquippedMeleeWeapon(slf);
		Npc_RemoveInvItem(slf,Hlp_GetInstanceID(Weapon));
		CreateInvItem(slf,Hlp_GetInstanceID(Weapon));
	};
	if(Npc_HasEquippedRangedWeapon(slf))
	{
		Weapon = Npc_GetEquippedRangedWeapon(slf);
		Npc_RemoveInvItem(slf,Hlp_GetInstanceID(Weapon));
		CreateInvItem(slf,Hlp_GetInstanceID(Weapon));
	};
};

func void B_NpcIsJailed(var C_Npc slf)
{
	B_UnequipWeapons(slf);
	slf.attribute[ATR_STRENGTH] = Condition_VLKDolch - 1;		//боец не может использовать даже кинжал
	slf.attribute[ATR_DEXTERITY] = Condition_Kurzbogen - 1;		//стрелок не может использовать даже короткий лук
	if((slf.guild == GIL_KDF) || (slf.guild == GIL_KDW) || (slf.guild == GIL_PAL) || (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS))
	{
		if(Npc_IsDrawingSpell(slf))
		{
			AI_UnreadySpell(slf);
		};
		slf.attribute[ATR_MANA] = Spl_Cost_Scroll - 1;		//маг не может использовать даже свиток
		slf.attribute[ATR_MANA_MAX] = Spl_Cost_Scroll - 1;
	};
};

func void B_NpcIsReleased(var C_Npc slf)
{
	if(slf.attribute[ATR_STRENGTH] != slf.aivar[REAL_STRENGTH])
	{
		slf.attribute[ATR_STRENGTH] = slf.aivar[REAL_STRENGTH];		//восстановление силы у бойца
	};
	if(slf.attribute[ATR_DEXTERITY] != slf.aivar[REAL_DEXTERITY])
	{
		slf.attribute[ATR_DEXTERITY] = slf.aivar[REAL_DEXTERITY];	//восстановление ловкости у стрелка
	};
	if(((slf.guild == GIL_KDF) || (slf.guild == GIL_KDW) || (slf.guild == GIL_PAL) || (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)) && (slf.attribute[ATR_MANA_MAX] != slf.aivar[REAL_MANA_MAX]))
	{
		slf.attribute[ATR_MANA_MAX] = slf.aivar[REAL_MANA_MAX];		//восстановление маны у мага
		slf.attribute[ATR_MANA] = slf.attribute[ATR_MANA_MAX];
	};
	AI_EquipBestMeleeWeapon(slf);
	AI_EquipBestRangedWeapon(slf);
};
Поскольку у меня глючила функция AI_UnequipWeapons(self) (не всегда снимала с NPC экипированное оружие, например, посох с Фернандо), пришлось написать её аналог B_UnequipWeapons(self). Скорее всего не будет работать запрет на экипировку арестанта Когтём Белиара, у которого задано нулевое требование к силе его обладателя. Поэтому придётся изменить минимальные требования для одноручного и двуручного вариантов Когтя (5 силы).
 
Сверху Снизу