Для установки функции в карту, вам нужно скопировать ее из нестандартного кода карты (подробный список "что и куда" для каждой функции смотрим ниже), создать в своей карте переменную типа "хэштаблица" ("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.
меня это пугает Дуся одобряет грибочки от бабушки засовывание всех переменных в хэш, когда можно лишь индекс к массивам с этими обьектами(всего 1 интегер)?
кстати насчёт скорости, это скорость в секунду, так ?
это скорость в секунду, умноженная на (1 разделить на 0.04), другими словами эта скорость should be в 25 раз меньше чем мы указываем в РО, обьект будет передвинут на скорость 25 раз в секунду т.к.:
Quote (Ty3uK)
call TimerStart(t, .04, true, function MoveDummy_Timer)
это скорость в секунду, умноженная на (1 разделить на 0.04), другими словами эта скорость should be в 25 раз меньше чем мы указываем в РО, обьект будет передвинут на скорость 25 раз в секунду т.к.:
ок, спс
нужен моделлер/жассер для аниме карты по наруто Shinobi Final War(S.F.W.),пишите в лс. Подробности тут http://warcraft3ft.info/forum/26-34400-1#1335316
Замечаний со стороны Дуоса, Драгона или Николаса не было ни разу
Ну, вообще-то здесь я согласен с Hexing: сохранение в хэш структуры - своеобразный компромисс между хэшем и массивами. Другое дело, что для этого либо нужен JNGP, либо с наработкой придется импортировать много переменных.
Ну, вообще-то здесь я согласен с Hexing: сохранение в хэш структуры - своеобразный компромисс между хэшем и массивами. Другое дело, что для этого либо нужен JNGP, либо с наработкой придется импортировать много переменных.
Любителям jass2 можно и самим имитировать структуры, а вообще можно просто создать массивы тех типов данных которые нужно было сохранить в хеш, и вешать только номер ячейки массива, и следовательно грузить толька 1 интегер и уже обращаться к массивам... Вроде тут и jngp не нужен
Делая эту наработку, я предполагал, что многие пользователи, используя гуи, не пользуются JNGP, поэтому и наработка сделана на "pure Jass 2" без костылей
SirNikolas, Ty3uK, а я понял, это же на vjasse - globals endglobals, да, на jass2 пришлось бы массивы копировать, тогда ладно, всё норм Тузик, даже не придраться Good work, mr Freeman!
Ty3uK, код прыжка юнита, ну и вообще коды передвижения дамми итд итп работают только с юнитами, или с группами тоже ?
нужен моделлер/жассер для аниме карты по наруто Shinobi Final War(S.F.W.),пишите в лс. Подробности тут http://warcraft3ft.info/forum/26-34400-1#1335316
Для установки функции в карту, вам нужно скопировать ее из нестандартного кода карты (подробный список "что и куда" для каждой функции смотрим ниже), создать в своей карте переменную типа "хэштаблица" ("Hashtable") с названием Hashtable и инициализировать ее в триггере инициализации карты:
Code
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). Как и куда:
Code
call MoveDummy(кастер, юнит которого будем двигать, расстояние, скорость, удалять ли юнита в конце движения)
call MoveDummyToTarget(кастер, юнит которого будем двигать, скорость, удалять ли юнита в конце движения)
call DamageGroupOfUnit(кастер, точка набора юнитов, радиус, урон, наносить ли урон зданиям, наносить ли урон иммунным к магии, наносить ли урон себе и союзникам)
Если что-то не понятно, то примеры применения есть в карте
Code
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.
llka, говножасс не предлагать (структуры не юзаю принципиально). Да и наработка расчитана на обычный ВЕ. Боже пишется с большой буквы. И не упоминай всуе. Могу закодить на дефайнах, но кому оно надо? Тем кто шарит это не нужно, а тем, кто нет - нужен JNGP.
Quote (llka)
структуру с методами
и будет 100500 методов, которые после парсера превратятся в такие же функции. Гениально
Ty3uK, Да забей эт я просто так. Ty3uK, А оно того стоит столько кода писать? Я в первмо посте забыл сказать: молодец, красавец, вот только бы не мелочился еще был бы наверное богом для "нешарящих"!
Добавлено (19 Март 2012, 14:26:56) --------------------------------------------- [DUОS],Астряк... непризнанный.