Для установки функции в карту, вам нужно скопировать ее из нестандартного кода карты (подробный список "что и куда" для каждой функции смотрим ниже), создать в своей карте переменную типа "хэштаблица" ("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.
Hexing, открой глазоньки и загляни в код, окда? Почему гуишникам? Да потому что они любят создавать периодический триггер, что еше то убожество. Насчет название - не парит. Пофиг как называется. Карта вообще называется GUI Must Die, и что?
Quote (Ty3uK)
Code
local real angle = Atan2(GetSpellTargetY() - GetWidgetY(caster), GetSpellTargetX() - GetWidgetX(caster))
Hexing, автор темы сделал наиболее востребованные варианты. Опять же, посмотри на название темы. Если тебе нужна большая гибкость, скачай knockback [DUОS]'а.
Если б я был гуишником, я бы никогда не использовал эту систему, мне было бы легче пользоваться наработкой именно на гуи даже если бы код представлял собой рвотную массу. Наверное поэтому эти системкы мало популярны среди гуишников даже если они просты в обращении.
Вот смотри сколько было вопросов по триггерам в разделе, которые задавали новички, даже если были рациональные ответы - решения на вопросы в виде жасса, новички все равно будут идти на компромисс используя гуи. Кароче я хотел всем этим сказать что лучше не печатать наработки от которых все новички сторонятся, а писать уроки - помочь им рахобратся, а не просто дать им то что они хотят без понятия вообще что ЭТО , да пусть они будут на жассе но от них толку будет больше так как любой пользователь не просто скачает наработку не зная как она работает, а поймет как устроена эта наработка что за что отвечает, и в дальнейшем они бы сами могли уже писать такие наработки.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Понедельник, 26 Декабря 2011, 19:00:34
Вот смотри сколько было вопросов по триггерам в разделе, которые задавали новички, даже если были рациональные ответы - решения на вопросы в виде жасса, новички все равно будут идти на компромисс используя гуи. Кароче я хотел всем этим сказать что лучше не печатать наработки от которых все новички сторонятся, а писать уроки - помочь им рахобратся, а не просто дать им то что они хотят без понятия вообще что ЭТО , да пусть они будут на жассе но от них толку будет больше так как любой пользователь не просто скачает наработку не зная как она работает, а поймет как устроена эта наработка что за что отвечает, и в дальнейшем они бы сами могли уже писать такие наработки.
ну так научи их, ты представь сколько таких нубов и что Тузику каждому разьяснять что да как? тут все зависит от желания, статей много, если гуишник захочет научиться jass то пожалуйса
http://xgm.ru/p/wc3/jass_introduction
наработка же для тех, кому она нужна и не более Ty3uK, Move -> Toss - круто =) и 2 скрин радует(раньше не замечал) и сделай ты уже возможность замены эффекта
GUI Must Die! v1.1 или Наработки для гуишников v1.1
В новой версии:
Даммикаст на юнита
Даммикаст на точку
Даммикаст без цели
Возможность добавление другого эффекта в "Подбрасывание" (или наоборот, его исключение)
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 dummy, real distance, real speed, boolean remove returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local unit caster = GetTriggerUnit() 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, 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 caster = null set t = null endfunction
function MoveDummyToTarget takes unit dummy, real speed, boolean remove returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local unit caster = GetTriggerUnit() 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 caster = null 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 unit caster = GetTriggerUnit() local real angle = Atan2(GetSpellTargetY() - GetWidgetY(caster), GetSpellTargetX() - GetWidgetX(caster)) 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 caster = null set t = null endfunction
function TossUnitToTarget takes unit u, string eff returns nothing local timer t = CreateTimer() local integer hid = GetHandleId(t) local unit caster = GetTriggerUnit() local real angle = Atan2(GetSpellTargetY() - GetWidgetY(caster), GetSpellTargetX() - GetWidgetX(caster)) call SaveAgentHandle(udg_Hashtable, hid, 0, u) 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, 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 caster = null 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
SirNikolas, объяснить людям, откуда же взять сразу ид не сложно, но многим лень залезать в нужную прогу и прочее... Так в свою карту я уже давно написал такую системку. Только с ид на входе, офк, я же знаю, где их взять
Ty3uK, можешь обьяснить в чём ошибка ? из редактора триггеров копирую: 1.основной код 2.скрипт из триггера инициализации 3.скрипт Движение дамми в точку каста при попытке запустить карту выдаёт ошибку, что в коде что-то неправильно вот значения установленные мной: call MoveDummyToTarget(udg_Dummy, 60., false)
нужен моделлер/жассер для аниме карты по наруто Shinobi Final War(S.F.W.),пишите в лс. Подробности тут http://warcraft3ft.info/forum/26-34400-1#1335316
нет, ведь этот код отправляет дамми в точку каста, он не нуждается в такой информации, разве нет ТуЗиК ?
Quote (Ty3uK)
Переменные скопировал? Автоматически они копироваться не будут. Тебе надо скопировать хэштаблицу Hashtable
переменные копировал, таблицу вроде тоже, хотя... мб забыл сейчас проверю, и да кстати, что там за триггер отключённый помимо триггеров для направления дамми итд... ?
Quote (Ty3uK)
Нет. Это не точка. Это скорость движения
кстати насчёт скорости, это скорость в секунду, так ?
нужен моделлер/жассер для аниме карты по наруто Shinobi Final War(S.F.W.),пишите в лс. Подробности тут http://warcraft3ft.info/forum/26-34400-1#1335316