Для установки функции в карту, вам нужно скопировать ее из нестандартного кода карты (подробный список "что и куда" для каждой функции смотрим ниже), создать в своей карте переменную типа "хэштаблица" ("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.
Ty3uK, посмотрел никогда не понимал как делать способности на основе канала, но вроде разобрался (спасибо Тузику за это) и вопрос: я так понимаю кастомные ID'ы приказа не будут работать?
Добавлено (08 Января 2013, 15:00:22) --------------------------------------------- ведь можно проверять кастующию абилку типом ордера (вроде как)
Добавлено (08 Января 2013, 15:03:01) --------------------------------------------- ещё вариант проверять по названию (самый выгодный вариант)
Если крикнет рать святая Или девица простая, Или даже вражья стая: "Кинь ты Русь, живи в раю!", Я скажу: "Не надо рая. Расступись, земля сырая, Я сейчас в тебя сыграю, И сыграю, и спою!"
или из-за нестандартного кода и кс это уже не для Гуишников?
Можно играть словами и ставить понты, а можно не выставлять себя интернет-героем и делать что-то полезное. В данной статье автор стремится опустить GUI и показать какой он великолепный, а не сделать что-то полезное. В нашей практике это называют "школота"
Если крикнет рать святая Или девица простая, Или даже вражья стая: "Кинь ты Русь, живи в раю!", Я скажу: "Не надо рая. Расступись, земля сырая, Я сейчас в тебя сыграю, И сыграю, и спою!"
Можно играть словами и ставить понты, а можно не выставлять себя интернет-героем и делать что-то полезное. В данной статье автор стремится опустить GUI и показать какой он великолепный, а не сделать что-то полезное. В нашей практике это называют "школота"
школота пытается доказать другому что он такой же школота. хммм
автор просто пытается упростить те вещи, которые очень любят костылять все новички, и не более.
Не оправдание.
Цитата (lawson)
школота пытается доказать другому что он такой же школота.
А какие-нибудь факты у тебя есть, трепло ты наше ? )
Если крикнет рать святая Или девица простая, Или даже вражья стая: "Кинь ты Русь, живи в раю!", Я скажу: "Не надо рая. Расступись, земля сырая, Я сейчас в тебя сыграю, И сыграю, и спою!"
Если крикнет рать святая Или девица простая, Или даже вражья стая: "Кинь ты Русь, живи в раю!", Я скажу: "Не надо рая. Расступись, земля сырая, Я сейчас в тебя сыграю, И сыграю, и спою!"
Если ты не понимаешь словосочетания "не влезай" то мозг воспален у тебя а не у меня.
Если крикнет рать святая Или девица простая, Или даже вражья стая: "Кинь ты Русь, живи в раю!", Я скажу: "Не надо рая. Расступись, земля сырая, Я сейчас в тебя сыграю, И сыграю, и спою!"
Если ты не понимаешь словосочетания "не влезай" то мозг воспален у тебя а не у меня.
нет нет нет нет нет, я так понял по этим словам
Цитата (Enfy)
Проще говоря
ты мне что то хотел сказать
Цитата (Enfy)
Не влезай
а это ни как вообще не относиться к предыдущиму моему и твоему посту
Цитата (Enfy)
1993 год.
если че 7 июля Или ты даун, взяв отрывки предложений и попытался их связать по смыслу этим постом?
Цитата (Enfy)
Если ты не понимаешь словосочетания "не влезай"
Добавлено (11 Февраля 2013, 23:43:44) --------------------------------------------- поэтому я и спрашивал, что несет твой воспаленый мозг, вроде не слаженных словосочетаний по смыслу.