Для установки функции в карту, вам нужно скопировать ее из нестандартного кода карты (подробный список "что и куда" для каждой функции смотрим ниже), создать в своей карте переменную типа "хэштаблица" ("Hashtable") с названием Hashtable и инициализировать ее в триггере инициализации карты:
Код
set udg_Hashtable = InitHashtable()
Что и куда копировать, чтобы "робило и пахало"
Движение юнита на расстояние - копируем MoveDummy_Timer, MoveDummy
Движение юнита в точку каста - копируем GetDistanceBetweenCoords, MoveDummy_Timer, MoveDummyToTarget
Подбрасывание юнита на расстояние - копируем TossUnit_Timer, TossUnitToTarget
Подбрасывание юнита в точку каста - копируем GetDistanceBetweenCoords, TossUnit_Timer, TossUnitToTarget
Даммикаст на цель - копируем DummycastToTarget
Даммикаст без цели - копируем DummycastNoTarget
Даммикаст в точку - копируем DummycastToPoint
Добавить эффект на юнита на время - копируем DestroyTimedEffect, AddTimedEffectToUnit
Добавить эффект на в точку на время - копируем DestroyTimedEffect, AddTimedEffectToPoint
Нанести урон в области - копируем DamageGroupOfUnit
Как же вызывать эти фичи
Вызываются эти функции через Личный сценарий (читай, Custom script). Как и куда:
Код
call MoveDummy(кастер, юнит которого будем двигать, расстояние, скорость, удалять ли юнита в конце движения)
call MoveDummyToTarget(кастер, юнит которого будем двигать, скорость, удалять ли юнита в конце движения)
call DamageGroupOfUnit(кастер, точка набора юнитов, радиус, урон, наносить ли урон зданиям, наносить ли урон иммунным к магии, наносить ли урон себе и союзникам)
Если что-то не понятно, то примеры применения есть в карте
Код
function GetDistanceBetweenCoords takes real x1, real x2, real y1, real y2 returns real return SquareRoot((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) endfunction
function MoveDummy_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer hid = GetHandleId(t) local unit dummy = LoadUnitHandle(udg_Hashtable, hid, 0) local real angle = LoadReal(udg_Hashtable, hid, 1) local real distance = LoadReal(udg_Hashtable, hid, 2) local real speed = LoadReal(udg_Hashtable, hid, 3) local real d = LoadReal(udg_Hashtable, hid, 4) local real x = GetWidgetX(dummy) + speed * Cos(angle) local real y = GetWidgetY(dummy) + speed * Sin(angle) if d >= distance then if LoadBoolean(udg_Hashtable, hid, 5) then call RemoveUnit(dummy) else call PauseUnit(dummy, false) endif call FlushChildHashtable(udg_Hashtable, hid) call PauseTimer(t) call DestroyTimer(t) else call SetUnitPosition(dummy, x, y) call SaveReal(udg_Hashtable, hid, 4, d + speed) endif set dummy = null set t = null endfunction
function MoveDummy takes unit caster, unit dummy, real distance, real speed, boolean remove returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local real angle = Atan2(GetSpellTargetY() - GetWidgetY(caster), GetSpellTargetX() - GetWidgetX(caster)) call SaveAgentHandle(udg_Hashtable, hid, 0, dummy) call SaveReal(udg_Hashtable, hid, 1, Atan2(GetSpellTargetY()-GetWidgetY(caster), GetSpellTargetX()-GetWidgetX(caster))) call SaveReal(udg_Hashtable, hid, 2, distance) call SaveReal(udg_Hashtable, hid, 3, speed) call SaveBoolean(udg_Hashtable, hid, 5, remove) call PauseUnit(dummy, true) call TimerStart(t, .04, true, function MoveDummy_Timer) set t = null endfunction
function MoveDummyToTarget takes unit caster, unit dummy, real speed, boolean remove returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local real angle = Atan2(GetSpellTargetY() - GetWidgetY(caster), GetSpellTargetX() - GetWidgetX(caster)) call SaveAgentHandle(udg_Hashtable, hid, 0, dummy) call SaveReal(udg_Hashtable, hid, 1, angle) call SaveReal(udg_Hashtable, hid, 2, GetDistanceBetweenCoords(GetSpellTargetX(), GetWidgetX(caster), GetSpellTargetY(), GetWidgetY(caster))) call SaveReal(udg_Hashtable, hid, 3, speed) call SaveBoolean(udg_Hashtable, hid, 5, remove) call PauseUnit(dummy, true) call TimerStart(t, .04, true, function MoveDummy_Timer) set t = null endfunction
function TossUnit_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer hid = GetHandleId(t) local unit u = LoadUnitHandle(udg_Hashtable, hid, 0) local real angle = LoadReal(udg_Hashtable, hid, 1) local real distance = LoadReal(udg_Hashtable, hid, 2) local real d = LoadReal(udg_Hashtable, hid, 3) local real z = LoadReal(udg_Hashtable, hid, 5) local real x = GetWidgetX(u) local real y = GetWidgetY(u) if d <= distance / 2 then set x = x + 10. * Cos(angle) set y = y + 10. * Sin(angle) set z = z + 25. call SetUnitPosition(u, x, y) call SetUnitFlyHeight(u, z, 0.) else set x = x + 10. * Cos(angle) set y = y + 10. * Sin(angle) set z = z - 25. call SetUnitPosition(u, x, y) call SetUnitFlyHeight(u, z, 0.) endif call SaveReal(udg_Hashtable, hid, 3, d + 10.) call SaveReal(udg_Hashtable, hid, 5, z) if z <= 0. then if HaveSavedString(udg_Hashtable, hid, 6) then call DestroyEffect(AddSpecialEffect(LoadStr(udg_Hashtable, hid, 6), x, y)) endif call PauseTimer(t) call DestroyTimer(t) call PauseUnit(u, false) call FlushChildHashtable(udg_Hashtable, hid) endif set u = null set t = null endfunction
function TossUnit takes unit u, real distance, string eff returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local real angle = Atan2(GetSpellTargetY() - GetWidgetY(u), GetSpellTargetX() - GetWidgetX(u)) call SaveAgentHandle(udg_Hashtable, hid, 0, u) call SaveReal(udg_Hashtable, hid, 1, angle) call SaveReal(udg_Hashtable, hid, 2, distance) call SaveReal(udg_Hashtable, hid, 3, 10.) call SaveStr(udg_Hashtable, hid, 6, eff) if UnitAddAbility(u, 'Amrf') then call UnitRemoveAbility(u, 'Amrf') endif call PauseUnit(u, true) call TimerStart(t, .01, true, function TossUnit_Timer) set t = null endfunction
function TossUnitToTarget takes unit u, string eff returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) call SaveAgentHandle(udg_Hashtable, hid, 0, u) call SaveReal(udg_Hashtable, hid, 1, Atan2(GetSpellTargetY() - GetWidgetY(u), GetSpellTargetX() - GetWidgetX(u))) call SaveReal(udg_Hashtable, hid, 2, GetDistanceBetweenCoords(GetSpellTargetX(), GetWidgetX(u), GetSpellTargetY(), GetWidgetY(u))) call SaveReal(udg_Hashtable, hid, 3, 10.) call SaveStr(udg_Hashtable, hid, 6, eff) if UnitAddAbility(u, 'Amrf') then call UnitRemoveAbility(u, 'Amrf') endif call PauseUnit(u, true) call TimerStart(t, .01, true, function TossUnit_Timer) set t = null endfunction
function DummycastToTarget takes unit caster, integer utype, integer atype, integer lvl, unit target, string order returns nothing local unit dummy = CreateUnit(GetOwningPlayer(caster), utype, GetWidgetX(caster), GetWidgetY(caster), 0.) call UnitAddAbility(dummy, atype) call IssueTargetOrderById(dummy, OrderId(order), target) call UnitApplyTimedLife(dummy, 'BTLF', .76) set dummy = null endfunction
function DummycastNoTarget takes unit caster, integer utype, integer atype, integer lvl, string order returns nothing local unit dummy = CreateUnit(GetOwningPlayer(caster), utype, GetWidgetX(caster), GetWidgetY(caster), 0.) call UnitAddAbility(dummy, atype) call IssueImmediateOrderById(dummy, OrderId(order)) call UnitApplyTimedLife(dummy, 'BTLF', .76) set dummy = null endfunction
function DummycastToPoint takes unit caster, integer utype, integer atype, integer lvl, location loc, string order returns nothing local unit dummy = CreateUnit(GetOwningPlayer(caster), utype, GetWidgetX(caster), GetWidgetY(caster), 0.) call UnitAddAbility(dummy, atype) call IssuePointOrderById(dummy, OrderId(order), GetLocationX(loc), GetLocationY(loc)) call UnitApplyTimedLife(dummy, 'BTLF', .76) set dummy = null endfunction
function DestroyTimedEffect takes nothing returns nothing local timer t = GetExpiredTimer() local integer hid = GetHandleId(t) call DestroyEffect(LoadEffectHandle(udg_Hashtable, hid, 0)) call FlushChildHashtable(udg_Hashtable, hid) call DestroyTimer(t) set t = null endfunction
function AddTimedEffectToUnit takes unit u, string e, string a, real time returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) call SaveAgentHandle(udg_Hashtable, hid, 0, AddSpecialEffectTarget(e, u, a)) call TimerStart(t, time, false, function DestroyTimedEffect) set t = null endfunction
function AddTimedEffectToPoint takes location p, string e, real time returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local real x = GetLocationX(p) local real y = GetLocationY(p) call SaveAgentHandle(udg_Hashtable, hid, 0, AddSpecialEffect(e, x, y)) call TimerStart(t, time, false, function DestroyTimedEffect) set t = null endfunction
function DamageGroup_Filter takes nothing returns boolean local integer hid = GetHandleId(GetExpiredTimer()) local unit t = GetFilterUnit() local unit u = LoadUnitHandle(udg_Hashtable, hid, 0) local real damage = LoadReal(udg_Hashtable, hid, 3) local boolean dbuilds = LoadBoolean(udg_Hashtable, hid, 4) local boolean dmagicimmune = LoadBoolean(udg_Hashtable, hid, 5) local boolean dally = LoadBoolean(udg_Hashtable, hid, 6) if (dally and dbuilds) or (dally and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) or (IsUnitEnemy(t, GetOwningPlayer(u)) and dbuilds) or (IsUnitEnemy(t, GetOwningPlayer(u)) and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) then call UnitDamageTarget(u, t, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) endif set u = null set t = null return true endfunction
function DamageGroup takes nothing returns nothing local timer t = GetExpiredTimer() local integer hid = GetHandleId(t) local unit u = LoadUnitHandle(udg_Hashtable, hid, 0) local real radius = LoadReal(udg_Hashtable, hid, 2) call GroupEnumUnitsInRange(LoadGroupHandle(udg_Hashtable, hid, 1), GetWidgetX(u), GetWidgetY(u), radius, Filter(function DamageGroup_Filter)) call DestroyGroup(LoadGroupHandle(udg_Hashtable, hid, 1)) call FlushChildHashtable(udg_Hashtable, hid) call DestroyTimer(t) set t = null set u = null endfunction
function DamageGroupOfUnit takes unit u, location loc, real radius, real damage, boolean dbuilds, boolean dmagicimmune, boolean dally returns nothing local group g = CreateGroup() local unit target call GroupEnumUnitsInRange(g, GetLocationX(loc), GetLocationY(loc), radius, null) loop set target = FirstOfGroup(g) exitwhen target == null if (dally and dbuilds) or (dally and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) or (IsUnitEnemy(target, GetOwningPlayer(u)) and dbuilds) or (IsUnitEnemy(target, GetOwningPlayer(u)) and not dbuilds and not IsUnitType(u, UNIT_TYPE_STRUCTURE)) then call UnitDamageTarget(u, target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS) endif call GroupRemoveUnit(g, target) endloop call DestroyGroup(g) set target = null set g = null endfunction
Вопрос-ответ
Как узнать равкод способности? В РО нажимаем Ctrl + D. Вместо названия способности появляется набор букв вида 'А000', который и надо записывать в нужную вам функцию.
Как узнать ордер способности (для даммикаста)? В РО ищем строчку вида "приказ" (прошу прощения, у меня англ редактор, поэтому не могу сказать точно) и слово, которое там написано и есть наш ордер. Примеры: thunderclaps, fireboat and etc.
Да нет тебе показалось. Просто делаешь одно и тоже, то что уже было только в более яркой обертке. Вот Borodach сделал толкову систему увеличения макс хп, шмуос запилил сборку предметов и т.к.
Добавлено (19 Март 2012, 14:42:08) --------------------------------------------- Я тебе уже говорил лучше бы писал статьи.
Добавлено (19 Март 2012, 14:49:15) --------------------------------------------- Статьи пишу так себе, да и наработка больше идет на решение злободневных проблем новичков
Да нет не ври. PS дай мне плюс а то уже надоело с нулем ходить.
Устное предупреждение за выпрашивание репутации. Ознакомьтесь с Правилами форума. Добавлено (19 Март 2012, 14:51:28) ---------------------------------------------
Quote (Ty3uK)
да и наработка больше идет на решение злободневных проблем новичков
Где в РО найти такую то споосбность, почему способность не кд'ится вот такие вопросы и далее, более
Quote (Ty3uK)
злободневные
Так к слову...
Сообщение отредактировал Kartoha - Понедельник, 19 Марта 2012, 18:34:15
Ty3uK, Так это то же работает на TriggerSleepAction() Который не может быть меньше чем .1 сек. Да и по информации его тож не стоит использовать. И это только пример, групы и много другое. Я делал похожее, но так хотел сделать максимально просто, что положил на это все
Karamba
Сообщение отредактировал Borodach - Понедельник, 19 Марта 2012, 19:53:15