Показать сообщение отдельно
Старый 24.03.2011, 04:14   #4323
Wandar

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Gothic 1, 2, 3: Технические вопросы

2Black Phantom:
Да уж, ну и задачку Вы мне задали, уважаемый. Думал, все мозги об неё сломаю. Там, кстати, совсем даже не в Ходжесе дело было, он-то как раз адекватно действовал. А вот все остальные наёмники... В общем, стоило ГГ кого-либо атаковать (или если кто-то атаковал самого ГГ), то все наёмники, находящиеся поблизости, тут же срывались с места и бежали убивать (именно убивать!) несчастного непися, покусившегося на здоровье драгоценного ГГ. :) И неважно, кто этот непись, будь это хоть Ходжес, хоть Ли, хоть сам Онар.

Я с самого начала заподозрил, что проблема где-то в скрипте B_AssessFightSound.d, т.к. именно он отвечает за реакцию неписей на драку. Как я его только не ковырял! Вообще не мог понять, в чём проблема, т.к. хоть как пристально этот скрипт ни рассматривай, с ним с виду всё в порядке, и работать он должен правильно. В конце концов я начал комментить здоровые куски этого скрипта, чтобы понять какая же часть его вызывает такую странную реакцию наёмников. Оказалось, вот эта:
Cпойлер(щелкните, чтобы прочесть):
if(((other.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder) || (other.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate) || (other.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) || (other.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) || (other.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill)) && (Npc_GetAttitude(self,other) == ATT_FRIENDLY))
* * *{
* * * * * *B_Attack(self,victim,AR_GuardCalledToKill,0);
* * * * * *return;
* * *};
* * *if(((victim.aivar[AIV_ATTACKREASON] == AR_GuardStopsIntruder) || (victim.aivar[AIV_ATTACKREASON] == AR_MonsterCloseToGate) || (victim.aivar[AIV_ATTACKREASON] == AR_HumanMurderedHuman) || (victim.aivar[AIV_ATTACKREASON] == AR_GuildEnemy) || (victim.aivar[AIV_ATTACKREASON] == AR_GuardCalledToKill)) && (Npc_GetAttitude(self,victim) == ATT_FRIENDLY))
* * *{
* * * * * *B_Attack(self,other,AR_GuardCalledToKill,0);
* * * * * *return;
* * *};

Вообще, следуя логике игры, она НИКАК не могла вызвать такую реакцию. Но тем не менее, именно именно из-за этой части скрипта наемники кидались на всякого, кто поднимал оружие на ГГ.

А потом меня осенило, и я полез посмотреть характеристики ГГ с помощью Марвина. Оказалось, действительно, у ГГ в выложенном сейве aivar[AIV_ATTACKREASON] было равно AR_GuildEnemy, т.е. в массиве переменных aivar в 9-м элементе было прописано 14. Но этот элемент массива вообще не должен меняться у ГГ! В нём прописывается причина атаки непися, чтобы другие действовали соответственно, если они окажутся свидетелями драки. Лично в моём прохождении aivar[AIV_ATTACKREASON] до самого конца оставался равен 0 (т.е. AR_NONE).

В общем, Black Phantom, признавайтесь - Марвином баловались? В aivar своего ГГ лазили? Только честно. Ибо если нет, то можно заключить, что при определённых обстоятельствах aivar[AIV_ATTACKREASON] ГГ может поменяться (хотя я до сих пор не представляю - КАК? Ведь скрипты AI, вроде B_Attack.d или ZS_Attack.d, для ГГ не выполняются), и лучше во всех скриптах, где меняется эта переменная, поставить перед изменениями проверки на то, что она принадлежит не ГГ.
Ответить с цитированием