Система атаки на клавишах. В отличие от прежних эту можно действительно назвать системой, а не нароботкой угоскила. Вы можете сами указывать дамаг, шанс на крит, тип атаки, для каждого юнита персоонално. Благодаря этому, можно легко устонавливать дамаг для разных предметов и т.п. Все обновления написаны ниже.
1.Скопируйте триггер AttackSystem. 2.В редакторе объектов настройте юнита который будет атаковать после нажатия клавишь:
Скопируйте способность "Атака".
Дайте её вашему юниту.
В пункте Бой - Атаки установите нет.
Уберите галочку, если она не убрана в пункте Характеристики - Может бежать.
3.Скопируйте триггер Test, или если вы обсолютно не знаете jass, то скопируйте триггер GUITest со всеми глобальными переменными.
Обновления:
1.Система полностью переписана, теперь она точно без утечек. 2.Оптимизирована. 3.Более лёгкое использование. 4.Теперь в плавающем тексте пишется урон с учётом защиты атакованного юнита. 5.Сообщение о промахе показывается только тогда, когда вы действительно промахиваетесь, а не бъёте по пустому месту. 6.Убрана автоматическая атака, т.к она использовала хеш, да и вообще была лишней.
//Для нанесения урона используеться функция ATTACK_Unit(unit u,real radius,integer damage,real krit). // u - юнит который наносит урон. // radius - радиус разброса урона, урон наносится юнитам на 120 впереди u, в указанном радиусе. // damage - наносимый урон. // krit - шанс нанести критический удар в процентах. Что бы отключить крит установите его 0.Если число будет больше чем 100 , то процент будет равен двум последним цифрам этого числа. // Так же есть ещё 3.доп параметра attacktype, damagetype, и weapontype, которые указывать не обязательно. // Стандартные значения: // attacktype=ATTACK_TYPE_HERO // damagetype=DAMAGE_TYPE_NORMAL // weapontype=WEAPON_TYPE_WHOKNOWS
define { ATTACK_Unit(u,radius,damage,krit)=ATTACK##_Unit(u,radius,damage,krit,ATTACK_TYPE_HERO,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS) ATTACK_Un it(u,radius,damage,krit,at,dt,wt)=ATTACK##_Unit(u,radius,damage,krit,at,dt,wt) //Цифры здесь можно менять. TexTagTime=1.5//Время исчезания плавающего текста в секундах. TextTagSize=9 //Размер плавающего текста } //Дальше менять нельзя!
real ConvertRealMinMax(real r,real min,real max){whilenot r<max{r-=max};whilenot r>min{r+=max}; return r}//Возвращает число в диапозоне от min до max.
private nothing GroupNumbersEnum(){bj_groupCountUnits++} public integer GroupNumbers(group g){bj_groupCountUnits=0; ForGroup(g,function GroupNumbersEnum); return bj_groupCountUnits}//Количество юнитов в группе.
private boolean GetLifeAndEnemy(){return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(CASTER)) and GetWidgetLife(GetFilterUnit())>.0}//Условие для нанесения урона.
public nothing Unit(unit u,real radius,integer damage,real krit,attacktype at,damagetype dt,weapontype wt) { group g=CreateGroup() ; unit gu boolexpr cond=Condition(function GetLifeAndEnemy) real f=GetUnitFacing(u)*.0174532, x=GetWidgetX(u) ,y=GetWidgetY(u);trigger t krit=ConvertRealMinMax(krit,-1,101)//Получаем число в диапозоне от 0 до 100. CASTER=u GroupEnumUnitsInRange(g,x+120*Cos(f),y+120*Sin(f),radius,cond)//Добавление юнитов в группу, с проверкой. if GroupNumbers(g)>0{ do { gu=FirstOfGroup(g) exitwhen gu==null t=CreateTrigger() TriggerRegisterUnitEvent(t,gu,EVENT_UNIT_DAMAGED) Trigge rAd dAc tio n(t ,fu nction DamageReturn) if GetRandomReal(1,100)<=krit damage*=2 UnitDamageTarget(u,gu,damage,true,false,at,dt,wt) A ddTXT(gu,0,255,0,0,TextTagSize,TexTagTime,"Критичесский удар "+I2S(R2I(Damag))) else UnitDamageTarget(u,gu,damage,true,false,at,dt,wt) A ddT XT(gu,0,255,0,0,TextTagSize,TexTagTime,I2S(R2I(Damag))) endif GroupRemoveUnit(g,gu) } e l se G roupEnumUnitsInRange(g,x,y,300,cond) //Если юниты есть в радиусе 300, и кастер по ним не попал будет сообщение о промахе. if GroupNumbers(g)>0 {AddTXT(u,0,255,0,0,TextTagSize,TexTagTime,GetPlayerName(GetOwningPlayer(u))+" Промахнулся");GroupClear(g)} //================================================================================== } DestroyBoolExpr(cond);DestroyGroup(g);t=null;cond=null;g=null}//Устранение утечек и обнуление локалок. }
Сообщение отредактировал rixt7956 - Среда, 09 Марта 2011, 19:17:33
Добавлено (07-03-2011, 11:05) --------------------------------------------- Тем более, для использования, хватит знания обычного jass, или даже ГУИ с cs
rixt7956, плохо. очень плохо. FirtofGroup возвращает не самого ближнего юнита, тем более не учитывается угол поворота. Дописывай просчет ближайшего юнита с учетом угла поворота, иначе эта система бессмыслена.
А ничо что ты вызываешь постоянно эту ф-ю с одними и теме же параметрами? Эта функция должна иметь вид: AddTXT(u,Damag), а все остальное должно быть внутри.
В общем я думаю ты понял почему система и код неочень.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Возможно если ты раскроешь глаза пошире, то увидишь параметры там разные, там есть отдельный вызов для крита, обычного дамага, и промаха. А вот насчет угла и расстояния че то не подумал, спасибо за идею, потом допишу.
Добавлено (07-03-2011, 12:11) --------------------------------------------- Faion, Параметры я не вставил внутрь, что бы можно было нормально использовать функцию добавления текста из вне библиотеки.