И так, давайте разберем всех нас интересующих атак хук. Для
чего он нужен вы наверное уже уяснили из предыдущих статей на
сайте, а теперь давайте перейдем к самому захватывающему
действу, а именно рассмотрению общей структуры кода. Конечно мы
не будет досконально рассматривать все детали, но общий смысл
уловить будет несложно.
Начнем пожалуй.
Как всегда подключаем необходимые нам модули и инклюды, после
этого считываем конфиг фалы. Для работы нам хватит “itemdesc”,
“*:npcdesc” и “*:skills”.
После слов: exported function MyAttack(attacker, defender),
начинаем делать разные проверки, на видимость оппонентов, на
зоны где невозможна атака и т.д., примерно будет выглядеть все
это так:
npccfg := ReadConfigFile("::npcdesc");
itmcfg := ReadConfigFile(":*:itemdesc");
skillcfg := ReadConfigFile(":*:skills");
SafeZone(attacker);
if((attacker == defender) && (!attacker.cmdlevel))
return 1;
endif
if(!CheckLineOfSight(attacker, defender))
return 1;
endif
if((attacker.frozen == 1) || (attacker.paralyzed == 1))
return 1;
endif
Если у участников сражения есть бонусы к атаке или защите их
также необходимо считать. Считываем у атакующего и защищающегося
бросок к атаке. Если у атакующего бросок атаки больше чем у
защищающегося то увеличиваем бонус атаки, если нет то уменьшаем.
Потом смотрим каким оружием действует атакующий:
weapon := GetEquipmentByLayer(attacker, 0x01);
if(!weapon)
weapon := GetEquipmentByLayer(attacker, 0x02);
endif
endif
Далее определяем кто у нас атакующий если он НПС, то значения
всех звуков и используемый скилл считываем из кфг файла, если
атакующий игрок, то значение анимации звуков и т.д. берем из
значений оружия.
Если значения не получены, то будем считать, что атакующий
использует wrestling.
Для просто ты мы будем хукать только использование холодного
оружия, а хук метательного оружия оставим оставим на совесть
коровского атак хука, для этого напишем:
if(skillId == "Archery")
return 0;
endif
Потом теже действия, выполняем для защищающегося и получаем
значения:
var ska := CInt(GetAttribute(attacker, skillId));
var skd := CInt(GetAttribute(defender, skillIdd));
var rand := RandomInt(100)+1;
после чего рассчитываем шанс, формула может быть любой, как
пример напишем например вот такую:
var chance :=
CInt(100*(ska+50)/(2*skd+100)+CInt(atackbonus-defbonus));
И смотрите попал ли атакующий или нет?
If(rand <= chance то
После чего нужно рассчитать в какую часть тела произошло
попадание и получить какой вид брони с каким армомром одет на
эту часть тела, например:
layerarmor := GetEquipmentByLayer(defender, layer);
После чего получить суммарное значение брони:
if(!layarmor.ar)
armor := CInt(defender.ar/2);
else
armor := CINT(layarmor.ar)+ CInt(defender.ar_mod);
endif
else // дефендер НПС
armor :=
CInt(npccfg[defender.npctemplate].ar)+Cint(defender.ar_mod);
endif
Потом получаем значение урона оружия и рассчитываем базовое
значение повреждения.
Если вы собираетесь использовать параметр силы и анатомии, а
также есть учет расовых особенностей, то рассчитываете их и
добавляете к базовым повреждениям. Делаете учет на качество
оружия и рассчитываете новое значение повреждений:
var rawdamage :=
CInt(basedmg*(25+GetAttribute(attacker,"tactics"))/100)+strmod+anatommod+racebonus;
Далее проверяете использует ли защищающейся щит, если да
(смотрите опять же по эквипу на 2 лэер), то вычитаете из
rawdamege значение армор класса щита, тут можно также
варьировать значениям смотря на то какой тип щита используется и
каким оружием произошло нанесение удара.
Опять же из rawdamage вычитаем значение armor которое мы
получили когда смотрели в какую часть тела был нанесен удар.
Все теперь мы получили все необходимые значения, а именно
attacker, defender, weapon, armor, basedmg, rawdamage и передаем
их на запуск mainhitscript’у.
После чего, повышаем боевые скиллы:
var skill_id := FindSkillidByIdentifier(skillId);
AwardPoints(attacker, SKILLID_TACTICS, value);
AwardPoints(attacker, skill_id, value);
Если шанс попадания не прошел, то проигрываем звук промахивания:
SendSysMessage(attacker, "!!!MIMO!!!");
PlaySoundEffect(attacker, CInt(misssound));
return 1;
endif
Вот собственно и все. Это самый простенький пример написания
атак хука.