Показать сообщение отдельно
Старый 23.02.2012, 22:43   #235
Dimus

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

По умолчанию Re: M2:Темная Сага

2stp:
Тогда придётся напомнить. Вот выдержка из FAQ по исправлению известных багов в G2a, которую в 2008 году составил камрад Ukur из команды Mighty DWARF:
Cпойлер(щелкните, чтобы прочесть):
I. Исправление оружейного бага в Г2а при превращениях.


Многим игрокам и модостроителям Г2а хорошо известен один неприятный баг с оружием, которое имеет либо положительные, либо отрицательные бонусы к умению сражения.
При экипировке такого бонусного оружия к владению, как и положено, прибавляется либо убавляется степень владения оружием, но при использовании заклинаний превращения вместе с таким оружием происходит сбой и у играющего может НАВСЕГДА исчезнуть честно заработанный навык сражения.

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

Мы же при разработке своего проекта StrongHand нашли причину сбоев и устранили её.

Для этого рассмотрим функцию начисления и удаления оружейного бонуса в Г2а.
За начисление бонуса к одноручному оружию отвечает скрипт Einhand_EquipBonus.d
За начисление бонуса к двуручному оружию отвечает скрипт Zweihand_EquipBonus.d

----------- ----------- -----------

Рассмотрим один пример для одноручного оружия из скрипта Einhand_EquipBonus.d:
Код:
func void Equip_1H_01() //Эта функция срабатывает при экипировке оружия.{ * * *if(Npc_IsPlayer(self)) //Эта функция проверяет, является ли пользователь оружия Главным Героем. * * *{ * * * * * *B_AddFightSkill(self,NPC_TALENT_1H,Waffenbonus_01); //Эта функция добавляет бонус к навыкам сражения. * * *};};func void UnEquip_1H_01() //Эта функция срабатывает при снятии оружия.{ * * *if(Npc_IsPlayer(self)) //Эта функция проверяет, является ли пользователь оружия Главным Героем. * * *{ * * * * * *B_AddFightSkill(self,NPC_TALENT_1H,-Waffenbonus_01); //Эта функция удаляет бонус из навыка сражения. * * *};};
Так вот вся соль как раз и кроется в функции Npc_IsPlayer(self), которая проверяет является ли пользователь оружия Главным Героем. Дело в том, что эта функция НЕ РАБОТАЕТ, когда ГГ превращается в какое-либо существо.
Для решения проблемы была найдена РАБОЧАЯ альтернатива данной функции - уникальный идентификтор ГГ, равный нулю, который определяет ГГ в любом обличии и не вызывает сбой при расчете бонуса.

В общем, для исправления бага требуется в обоих оружейных скриптах Einhand_EquipBonus.d и Zweihand_EquipBonus.d заменить все строки if(Npc_IsPlayer(self)), на if(self.ID == 0)


----------- ----------- -----------

Исправленный пример будет выглядеть так:
Код:
func void Equip_1H_01() //Эта функция срабатывает при экипировке оружия.{ * * *if(self.ID == 0) //Эта операция проверяет, является ли пользователь оружия Главным Героем по его уникальному идентификатору №0. * * *{ * * * * * *B_AddFightSkill(self,NPC_TALENT_1H,Waffenbonus_01); //Эта функция добавляет бонус к навыкам сражения. * * *};};func void UnEquip_1H_01() //Эта функция срабатывает при снятии оружия.{ * * *if(self.ID == 0) //Эта операция проверяет, является ли пользователь оружия Главным Героем по его уникальному идентификатору №0. * * *{ * * * * * *B_AddFightSkill(self,NPC_TALENT_1H,-Waffenbonus_01); //Эта функция удаляет бонус из навыка сражения. * * *};};
В некоторых проектах этод метод исправления уже был опробован, например GlobalMod от Magic TEAM и Unnamed от dixie.

dixie к тому же развил идею и нашел другую рабочую альтернативу уникального идентификатора ГГ - его уникальный номер голоса, который также успешно определяет ГГ в любом обличии.
В варианте от dixie данный пример исправления будет выглядеть так:
Код:
func void Equip_1H_01() //Эта функция срабатывает при экипировке оружия.{ * * *if(self.voice == 15) //Эта операция проверяет, является ли пользователь оружия Главным Героем по его уникальному голосу №15. * * *{ * * * * * *B_AddFightSkill(self,NPC_TALENT_1H,Waffenbonus_01); //Эта функция добавляет бонус к навыкам сражения. * * *};};func void UnEquip_1H_01() //Эта функция срабатывает при снятии оружия.{ * * *if(self.voice == 15) //Эта операция проверяет, является ли пользователь оружия Главным Героем по его уникальному голосу №15. * * *{ * * * * * *B_AddFightSkill(self,NPC_TALENT_1H,-Waffenbonus_01); //Эта функция удаляет бонус из навыка сражения. * * *};};
Ответить с цитированием