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); //Эта функция удаляет бонус из навыка сражения. * * *};};