Сейчас 13:01:14 Воскресенье, 28 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » [Статья]Делаем заклинание как в доте(воденное перемещение)
[Статья]Делаем заклинание как в доте(воденное перемещение)
KartohaДата: Воскресенье, 21 Ноября 2010, 16:29:20 | Сообщение # 26
10 уровень
Группа: Ветераны
Сообщений: 2851
Награды: 1
Блокировки:
На месте автора я бы назвал эту тему "Как по нубски сделать спелл из доты или Для неимеющих воображения нубов".
 

FkoFFДата: Воскресенье, 21 Ноября 2010, 17:33:07 | Сообщение # 27
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (Omni174)
Решил написать статью для будующих ну или настоящих спеллмейкеров,Приступим 1.Создадим Героя(любого) я выбрал мэв 2.Удалим все заклинания и дадим одно(кастующие)я выбрал мощ гор 3.Откроем окно триггеров 4.Пишем вот такой триггер 5.Извините забыл!(Добавте в начало действий тригерр:Боевая единица - Make unit Invulnerable (Сделать юнита неуязвимым) и в конце действий поставьте Make unit Vulnerable(Уязвимым) 6.Расставьте врагов и юзайте) 7.Описание:Мы сделали тригер с событием что герой использует данную способность сравнили та ли нужная способность выполняется и сделали каждые 0.01 игровых секунд перемещение в сторону куда смотрит герой с уроном и эффектом Скачать пример(12.7 кб) Ссылка действительна 30 дней

во первых - утечно, во вторых - вейты могут повесить поток, по этому их нельзя использовать.
в третьих - сам спелл выполнен на 1 из 100.


 

[stebashka]Дата: Воскресенье, 21 Ноября 2010, 18:28:39 | Сообщение # 28
пути и нити разными бывают
Группа: Библиотекари
Сообщений: 4719
Награды: 5
Блокировки:
ок ок статья уг и все такое, высказались? злодеи >(

ну тогда сделайте хороший не утечный спелл и выложите его сюда, наука для автора и всех прочих будет


 

DarkVaderДата: Воскресенье, 21 Ноября 2010, 19:06:17 | Сообщение # 29
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (|stebashka|)
ну тогда сделайте хороший не утечный спелл и выложите его сюда, наука для автора и всех прочих будет

ок ок, выложу чуть позже

 

[stebashka]Дата: Воскресенье, 21 Ноября 2010, 19:53:31 | Сообщение # 30
пути и нити разными бывают
Группа: Библиотекари
Сообщений: 4719
Награды: 5
Блокировки:
ок ок, жду

 

DarkVaderДата: Воскресенье, 21 Ноября 2010, 21:01:48 | Сообщение # 31
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Вот вам спел морфа:
+: MUI , легко настраивается, безутечен, быстрая скорость работы, урон настраивается в РО
-: на Jass не для новичков, но при желании легко интегрируется в свою карту

Code

function Trig_Spell_Conditions takes nothing returns boolean
     return GetSpellAbilityId() == 'A000'
endfunction

function TimerActions takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit caster = LoadUnitHandle( udg_HASH, GetHandleId(t), 1)
local location targetpoint = LoadLocationHandle( udg_HASH, GetHandleId(t), 2)
local real dx = GetLocationX(targetpoint) - GetUnitX(caster)
local real dy = GetLocationY(targetpoint) - GetUnitY(caster)
local real distance = SquareRoot((dx*dx) + (dy*dy))
local real angle = LoadReal( udg_HASH, GetHandleId(t), 4)
if( distance > 50)then
  call SetUnitPosition( caster, GetUnitX(caster) + ( 50 * Cos(angle)), GetUnitY(caster) + ( 50 * Sin(angle)))
  call DestroyEffect( AddSpecialEffectTarget("Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl", caster, "origin"))
else
  call PauseTimer(t)
  call UnitRemoveAbility(caster, 'A002')
  call SetUnitPathing( caster, true)
  call SetUnitVertexColor( caster, 255, 255, 255, 255)
  call RemoveLocation(targetpoint)
  call FlushChildHashtable( udg_HASH, GetHandleId(t))
  call DestroyTimer(t)
endif
  set t = null
  set caster = null
  set targetpoint = null  
endfunction

function Trig_Spell_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local location targetpoint = GetSpellTargetLoc()
local timer t = CreateTimer()
local real angle = Atan2( GetLocationY(targetpoint) - GetUnitY(caster), GetLocationX(targetpoint) - GetUnitX(caster))  
    call SetUnitPathing( caster, false)
    call SetUnitVertexColor( caster, 255, 255, 255, 0)
    call UnitAddAbility( caster, 'A002')
    call SetUnitAbilityLevel( caster, 'A001', GetUnitAbilityLevel( caster, 'A000'))
    call SetPlayerAbilityAvailable ( GetOwningPlayer(caster), 'A002', false)
    call SaveUnitHandle( udg_HASH, GetHandleId(t), 1, caster)
    call SaveLocationHandle( udg_HASH, GetHandleId(t), 2, targetpoint)
    call SaveReal( udg_HASH, GetHandleId(t), 4, angle)
    call TimerStart( t, 0.05, true, function TimerActions)
  set caster = null
  set targetpoint = null
  set t = null  
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
     set gg_trg_Spell = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT )
     call TriggerAddCondition( gg_trg_Spell, Condition( function Trig_Spell_Conditions ) )
     call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
endfunction

Вот сам Пример
Спелл при желании можно еще оптимизировать.

Добавлено (21-11-2010, 21:01)
---------------------------------------------
еще хочу добавить
что в спеле который приведен в основе статьи мной насчитано за каждое применение 27 утечек точек и 9 утечек эффектов

 

FkoFFДата: Воскресенье, 21 Ноября 2010, 21:41:53 | Сообщение # 32
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
DarkVader, утечки в любом случае есть. Точки по умолчанию утечны, удаляй ты их или не удаляй.

мой вариант:

Для начала создаем две переменные. TempUnit - Боевая Единица и Data - Хэштаблица.

Код:



ЭТО - в шапку карты (триггер с иконкой свитка)
Code

function GetAngle takes real x1, real y1, real x2, real y2 returns real  
         return bj_RADTODEG * Atan2(y2 - y1, x2 - x1)  
endfunction

function GetDist takes real x1, real y1, real x2, real y2 returns real  
         return SquareRoot((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1))  
endfunction

function PolarX takes real x,  real dist, real angle returns real  
         return x + dist * Cos(angle * bj_DEGTORAD)  
endfunction

function PolarY takes real y,  real dist, real angle returns real  
         return y + dist * Sin(angle * bj_DEGTORAD)  
endfunction


ЭТО - В триггер с именем PEW

Code

                            
function Trig_Pew_Conditions takes nothing returns boolean
     return ( GetSpellAbilityId() == 'AHfs' )
endfunction

function PewConds takes nothing returns boolean
   return IsUnitAlly(GetFilterUnit(),GetOwningPlayer(udg_TempUnit)) == false and GetWidgetLife(GetFilterUnit()) > 0. and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false  
endfunction

function PewForGroup takes nothing returns nothing
local unit u1 = udg_TempUnit
local unit u2 = GetEnumUnit()
local real constdmg = 10 + (10 * I2R(GetUnitAbilityLevel(u1, 'AHfs')))
call UnitDamageTarget(u1,u2, constdmg,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
set u1 = null
set u2 = null
endfunction

function MoveAndDmgPew takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
   local unit u = LoadUnitHandle(udg_Data, i, 1)
   local real x1 = GetUnitX(u)
   local real y1 = GetUnitY(u)
   local real x2 = LoadReal(udg_Data, i, 2)
   local real y2 = LoadReal(udg_Data, i, 3)
   local real array temp
   local real constdist = 30
   local real constrad = 300
   local string constfx = "Objects\\Spawnmodels\\Human\\HCancelDeath\\HCancelDeath.mdl"
   local boolexpr b  
   local group g = CreateGroup()

   set udg_TempUnit = u
   set b = Condition(function PewConds)   
   set temp[1] = GetDist(x1,y1,x2,y2)
   set temp[2] = GetAngle(x1,y1,x2,y2)
   set x1 = PolarX(x1, constdist, temp[2])
   set y1 = PolarY(y1, constdist, temp[2])
   call SetUnitX(u, x1)
   call SetUnitY(u, y1)
   call DestroyEffect(AddSpecialEffect( constfx, x1, y1))
   call GroupEnumUnitsInRange(g, x1, y1, constrad, b)
   set udg_TempUnit = u
   call ForGroup(g, function PewForGroup)

   if (temp[1] < constdist) or (temp[1] > 900) then
   call PauseUnit(u, false)
      call SetUnitPathing(u, true)
   call DestroyTimer(t)
   call FlushChildHashtable(udg_Data, i)
   else
   endif

   call DestroyGroup(g)
   call DestroyBoolExpr(b)
    
   set u = null
   set t = null
   set b = null
   set g = null
   endfunction
    
    
         

    

function Trig_Pew_Actions takes nothing returns nothing
    local timer t = CreateTimer()
    local unit u = GetTriggerUnit()
    local integer i = GetHandleId(t)
    local real x = GetLocationX(GetSpellTargetLoc())
    local real y = GetLocationY(GetSpellTargetLoc())
   
       call SetUnitPathing(u, false)
    call PauseUnit(u, true)
    call SaveUnitHandle(udg_Data, i, 1, u)
    call SaveReal(udg_Data, i, 2, x)
    call SaveReal(udg_Data, i, 3, y)
    call TimerStart(t, 0.03, true, function MoveAndDmgPew)
     
    set u = null
    set t = null  
endfunction

//==== Init Trigger Pew ====
function InitTrig_Pew takes nothing returns nothing
     set gg_trg_Pew = CreateTrigger()
     call TriggerRegisterAnyUnitEventBJ( gg_trg_Pew, EVENT_PLAYER_UNIT_SPELL_EFFECT )
     call TriggerAddCondition(gg_trg_Pew, Condition(function Trig_Pew_Conditions))
     call TriggerAddAction(gg_trg_Pew, function Trig_Pew_Actions)
endfunction


ЭТО - через custom script в триггер с событием "инициализация карты"

Code
set udg_Data = InitHashtable()


[Ссылка на загрузку]



Настройка:

constdist в функции MoveAndDmgPew - расстояние на которое юнит будет двигаться с каждым запуском.
constrad в функции MoveAndDmgPew - радиус в котором будет наносится урон при движении героя.
constdmg в функции PewForGroup - формула урона
constfx в функции MoveAndDmgPew - путь к модели спецэффекта

в условие триггера и в PewForGroup следует ввести равкод своего спелла для корректной работы.


 

DarkVaderДата: Понедельник, 22 Ноября 2010, 00:09:46 | Сообщение # 33
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
FkoFF, я проанализировал твой код и хочу сказать следующее
1) зачем ты так усложняешь конструкцию? делаешь ненужные действия пренебрегая движком варкрафта
2) блок отдельных функций будет полезным только в том случае если использовать его не только в одном спеле, а так это просто хлам который придает дополнительную нагрузку снижая скорость работы триггера и без того нагруженную кучей бесполезных действий
3) сомнительная муишность, так как существет маленькая вероятность того что спел даст сбой при одновременном применении сразу у нескольких героев, и с повышением количества героев эта вероятность будет катострофически повышаться
4) мелоч, но в доте урон наносится однократно а не постепенно как у тебя
5) объявляешь много локалок, зачем? я надеюсь ты скажешь что это для удобста вользователей и более леггкой настройки
6) и вместе с твоим блоком функций у тебя получается примерно 100 строк кода, мой способ в два раза короче

На твое замечание про использование мной точек, пожалуйста мой ответ
переписал спел, ни одной точки + еще сократил количесво объявляемых локалок

Code

function Trig_Spell_Conditions takes nothing returns boolean
     return GetSpellAbilityId() == 'A000'
endfunction

function TimerActions takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit caster = LoadUnitHandle( udg_HASH, GetHandleId(t), 1)
local real dx = LoadReal( udg_HASH, GetHandleId(t), 2) - GetUnitX(caster)
local real dy = LoadReal( udg_HASH, GetHandleId(t), 3) - GetUnitY(caster)
local real angle = LoadReal( udg_HASH, GetHandleId(t), 4)
if( SquareRoot((dx*dx) + (dy*dy)) > 50)then
  call SetUnitPosition( caster, GetUnitX(caster) + ( 50 * Cos(angle)), GetUnitY(caster) + ( 50 * Sin(angle)))
  call DestroyEffect( AddSpecialEffectTarget("Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl", caster, "origin"))
else
  call PauseTimer(t)
  call UnitRemoveAbility(caster, 'A002')
  call SetUnitPathing( caster, true)
  call SetUnitVertexColor( caster, 255, 255, 255, 255)
  call FlushChildHashtable( udg_HASH, GetHandleId(t))
  call DestroyTimer(t)
endif
  set t = null
  set caster = null  
endfunction

function Trig_Spell_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local timer t = CreateTimer()
local real angle = Atan2( GetSpellTargetY() - GetUnitY(caster), GetSpellTargetX() - GetUnitX(caster))  
    call SetUnitPathing( caster, false)
    call SetUnitVertexColor( caster, 255, 255, 255, 0)
    call UnitAddAbility( caster, 'A002')
    call SetUnitAbilityLevel( caster, 'A001', GetUnitAbilityLevel( caster, 'A000'))
    call SetPlayerAbilityAvailable ( GetOwningPlayer(caster), 'A002', false)
    call SaveUnitHandle( udg_HASH, GetHandleId(t), 1, caster)
    call SaveReal( udg_HASH, GetHandleId(t), 2, GetSpellTargetX())
    call SaveReal( udg_HASH, GetHandleId(t), 3, GetSpellTargetY())
    call SaveReal( udg_HASH, GetHandleId(t), 4, angle)
    call TimerStart( t, 0.05, true, function TimerActions)
  set caster = null
  set t = null  
endfunction

function InitTrig_Spell takes nothing returns nothing
     set gg_trg_Spell = CreateTrigger(  )
     call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT )
     call TriggerAddCondition( gg_trg_Spell, Condition( function Trig_Spell_Conditions ) )
     call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
endfunction

и обновленная версия Morf 0.2

 

FkoFFДата: Понедельник, 22 Ноября 2010, 00:19:56 | Сообщение # 34
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (DarkVader)
2) блок отдельных функций будет полезным только в том случае если использовать его не только в одном спеле, а так это просто хлам который придает дополнительную нагрузку снижая скорость работы триггера и без того нагруженную кучей бесполезных действий

этот блок функций нужен для работы с координатами, конечно же не в одном единственном спелле )
Quote (DarkVader)
3) сомнительная муишность, так как существет маленькая вероятность того что спел даст сбой при одновременном применении сразу у нескольких героев, и с повышением количества героев эта вероятность будет катострофически повышаться

не существует подобного шанса. Работа триггера на порядок выше даже максимально синхронизированного каста этих двух спеллов.
Quote (DarkVader)
4) мелоч, но в доте урон наносится однократно а не постепенно как у тебя

у тебя урон вообще не наносится =)
бтв, можно создать группу и прицепить её к герою + проверять - есть ли в группе нужный юнит. Оптимизировать лень )

на счет локалок. Лучше вбить один раз в локалку GetHandleId чем каждый раз его вызывать. Почему? Повышает читаемость кода, снижает нагрузку за счет снижения количества вызванных функций.


 

DarkVaderДата: Понедельник, 22 Ноября 2010, 00:44:15 | Сообщение # 35
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (FkoFF)
этот блок функций нужен для работы с координатами, конечно же не в одном единственном спелле )

в таком случае с тобой согласен, но полезен он только тем пользователям которые знаю что с ним делать.

Quote (FkoFF)
не существует подобного шанса. Работа триггера на порядок выше даже максимально синхронизированного каста этих двух спеллов.

в этом я с тобой готов поспорить, скорость работы отдельных функций согласись не является константой, и чем больше героев одновременно запустят спел тем больше шансов погрешности и сбоя спела, незначителного но мало приятного

Quote (FkoFF)
у тебя урон вообще не наносится =)

ты мой пример скачивал? вижу что нет, да и в код мой особо не вглядывался...
call UnitAddAbility( caster, 'A002') - вот что наносит урон, и это сокращает аж в половину длинну и сложность кода, повышая скорость его работы и эффективность

Quote (FkoFF)
бтв, можно создать группу и прицепить её к герою + проверять - есть ли в группе нужный юнит

первоночально я так и хотел сделать спел но потом подумал что это бред и тонны ненужного кода, и тем более никак не назову это оптимизацией

Quote (FkoFF)
на счет локалок. Лучше вбить один раз в локалку GetHandleId чем каждый раз его вызывать. Почему? Повышает читаемость кода, снижает нагрузку за счет снижения количества вызванных функций.

возможно в некоторых случаях да, но реалы никуда не деваются даже при обнулении а скорость работы это не намного может повысить
а это local string constfx = "Objects\\Spawnmodels\\Human\\HCancelDeath\\HCancelDeath.mdl" помоему вообще полный бред


Сообщение отредактировал DarkVader - Понедельник, 22 Ноября 2010, 00:49:23
 

FkoFFДата: Понедельник, 22 Ноября 2010, 01:25:07 | Сообщение # 36
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (DarkVader)
возможно в некоторых случаях да, но реалы никуда не деваются даже при обнулении а скорость работы это не намного может повысить а это local string constfx = "Objects\\Spawnmodels\\Human\\HCancelDeath\\HCancelDeath.mdl" помоему вообще полный бред

почему полный бред? вместо того что бы искать в коде нужное место - достаточно заменить текст здесь. Можно вообще подобную же штуку добавлять в хэш к спеллу, будет наверное даже удобнее.
Quote (DarkVader)
первоночально я так и хотел сделать спел но потом подумал что это бред и тонны ненужного кода, и тем более никак не назову это оптимизацией

оптимизация не должна идти в ущерб функциональности.
Quote (DarkVader)
call UnitAddAbility( caster, 'A002') - вот что наносит урон, и это сокращает аж в половину длинну и сложность кода, повышая скорость его работы и эффективность

что за спелл? пламя преисподней? если да то бред. Некоторых юнитов может не задеть, других заденет дважды. Лучше и оптимальней делать все через триггеры.

Quote (DarkVader)
в этом я с тобой готов поспорить, скорость работы отдельных функций согласись не является константой, и чем больше героев одновременно запустят спел тем больше шансов погрешности и сбоя спела, незначителного но мало приятного

погрешности не может быть. Уверяю тебя. Там даже 0.000000000000000001% шанса нет.


 

DarkVaderДата: Понедельник, 22 Ноября 2010, 02:04:10 | Сообщение # 37
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (FkoFF)
почему полный бред? вместо того что бы искать в коде нужное место - достаточно заменить текст здесь...

о да ты наверно создаешь в этом спеле 50 разных эффектов и наверно эту строку сложно найти
call DestroyEffect( AddSpecialEffectTarget("Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl", caster, "origin"))
не надо пытаться делать сборную салянку из спела аля что можно применить для удобста
надо делать быстрый и чистый код, засорять его подобным хламом нубство, да и как надо писать код что бы потом не найти куда вставить строку с путями для эффекта

Quote (FkoFF)
оптимизация не должна идти в ущерб функциональности.

не должна, но то что ты наковеркал в коде назвать функциональностью сложно

Quote (FkoFF)
что за спелл? пламя преисподней? если да то бред. Некоторых юнитов может не задеть, других заденет дважды. Лучше и оптимальней делать все через триггеры.

да это жар преисподней, но
1) спел не заденет никого дважды, преодичность урона расчитать не сложно имея немного пространственного мышления
2) жар преисподней работает аналогично тому что ты изобразил в своем коде, все те недостатки что есть в жаре преиподней есть и в твоем случае
3) у тебя урон наносится не всем юнитам равный
4) я заметил у тебя стиль делать абсолютно все триггерно, сбавь обороты ты многое теряешь делая так

Quote (FkoFF)
погрешности не может быть. Уверяю тебя. Там даже 0.000000000000000001% шанса нет.

спорить не буду, баги твоей карты на твоей совести, и уж точно не моя забота
 

FkoFFДата: Понедельник, 22 Ноября 2010, 02:12:21 | Сообщение # 38
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
начинает проступать агрессия.
Quote (DarkVader)
надо делать быстрый и чистый код, засорять его подобным хламом нубство, да и как надо писать код что бы потом не найти куда вставить строку с путями для эффекта

я это делал не для себя а для нуба создавшего тему и затребовавшего подобный угоспелл, я принципиально пишу константы только в том месте где требуется использовать один и тот же мусор в 3+ отрывках кода.
Quote (DarkVader)
не должна, но то что ты наковеркал в коде назвать функциональностью сложно

наковеркал? ты о чем? ;D
Quote (DarkVader)
1) спел не заденет никого дважды, преодичность урона расчитать не сложно имея немного пространственного мышления

Разница только в том что ты добавляешь спелл что по факту является "тяжелой" функцией.


 

DarkVaderДата: Понедельник, 22 Ноября 2010, 02:34:14 | Сообщение # 39
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
хочу добавить что в некоторых случаях подобный способ единственно верный, точнее единственно реалезуемый=)
в общем каждый думает в меру своей испорченности :D

Добавлено (22-11-2010, 02:34)
---------------------------------------------

Quote (FkoFF)
Разница только в том что ты добавляешь спелл что по факту является "тяжелой" функцией.

Оо тяжолая функция? тяжелее этого?

Code

function PewConds takes nothing returns boolean   
     return IsUnitAlly(GetFilterUnit(),GetOwningPlayer(udg_TempUnit)) == false and GetWidgetLife(GetFilterUnit()) > 0. and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false    
endfunction

function PewForGroup takes nothing returns nothing   
local unit u1 = udg_TempUnit   
local unit u2 = GetEnumUnit()   
local real constdmg = 10 + (10 * I2R(GetUnitAbilityLevel(u1, 'AHfs')))   
call UnitDamageTarget(u1,u2, constdmg,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)   
set u1 = null   
set u2 = null   
endfunction

local group g = CreateGroup()
set b = Condition(function PewConds)   
call GroupEnumUnitsInRange(g, x1, y1, constrad, b)   
     set udg_TempUnit = u   
     call ForGroup(g, function PewForGroup)
    call DestroyGroup(g)   
     call DestroyBoolExpr(b)   
     
     set b = null   
     set g = null
      

я вижу проверку 3 условий для каждого юнита, а если юнитов 100? вызов 2 доплнительных функций не говоря о количестве вызываемых нэтивок, создание и удаление группы, глобальная переменная, куча дополнительных локалок переменных типа handle , и все это в противовес "это по сути тяжелая функция"

Quote (FkoFF)
я это делал не для себя а для нуба создавшего тему и затребовавшего подобный угоспелл, я принципиально пишу константы только в том месте где требуется использовать один и тот же мусор в 3+ отрывках кода.

знаешь такой подход не назвать верным, ведь ты подаешь плохой пример этому нубу, изначально учишь его неверному, учишь писать грязный засоренный код

Quote (FkoFF)
начинает проступать агрессия.

да что нет никакой агрессии, просто борьба за истину :D :D

Сообщение отредактировал DarkVader - Понедельник, 22 Ноября 2010, 02:43:46
 

FkoFFДата: Понедельник, 22 Ноября 2010, 02:49:03 | Сообщение # 40
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (DarkVader)
Оо тяжолая функция? тяжелее этого?

Однозначно. Код - мгновенное "бесплотное" математически-логическое уравнение, тогда как добавление юниту абилы - взаимодействие между двумя объектами, обладающими набором различных значений + задействует куда большее количество внутриигровых функций (в том числе и отображение способности у юнита). Посему, уверяю тебя, "легче" для движка - вписать 50-60 строк кода и задействовать их нежели добавить юниту способность.


 

DarkVaderДата: Понедельник, 22 Ноября 2010, 03:28:58 | Сообщение # 41
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (FkoFF)
математически-логическое уравнение

ок, представь квадратное уравнение и как легко оно решается и представь себе сложное дифференциальное уравнение
квадратное уравнение можно решить 3-5 строк, на дифференциальное уйдет от 50 - 200 в зависимости от его сложности, а универсальные методы потребуют еще намного большее количество строк

в твоем случае я вижу попытки решить диф уравнение, в своем коде я вижу квдаратное
подобный ответ меня не устраивает, мне нужны факты, математические доказательства что добавление спела будет тяжелее для системы чем провернуть все твои операции

Добавлено (22-11-2010, 03:28)
---------------------------------------------
да и кстати модели спелы объекты и т.д это такой же код

 

FkoFFДата: Понедельник, 22 Ноября 2010, 03:57:14 | Сообщение # 42
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (DarkVader)
в твоем случае я вижу попытки решить диф уравнение, в своем коде я вижу квдаратное подобный ответ меня не устраивает, мне нужны факты, математические доказательства что добавление спела будет тяжелее для системы чем провернуть все твои операции

дай спеллу 10 уровней и добавь его юниту. при ините - подвесит игру на пару секунд. Почему? потому что операция добавления юниту спелла в инитит спелл тогда как подобных проблем никогда не возникает с кодом.

Не доказательство?


 

DarkVaderДата: Понедельник, 22 Ноября 2010, 04:30:12 | Сообщение # 43
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (FkoFF)
никогда не возникает с кодом.

хорошо, будем играть по твоему

Quote (FkoFF)
я это делал не для себя а для нуба создавшего тему и затребовавшего подобный угоспелл

согласись нубу будет легче настроить урон в РО чем что то пытаться разобрать в коде=)

особенного его порадует эта формула 10 + (10 * I2R(GetUnitAbilityLevel(u1, 'AHfs'))) =))) потому как некоторые участини формума порой даже елементарную математику не знают

Quote (FkoFF)
подвесит игру на пару секунд

ой ой, офф всех дамми из своей карты... а то подвесят игру, делаем все через код Оо, инвиз и прыжки юнитов, все все через код, только код...
а то добавишь способность а она возмет и подвесит игру

 

FkoFFДата: Понедельник, 22 Ноября 2010, 04:33:24 | Сообщение # 44
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
Quote (DarkVader)
ой ой, офф всех дамми из своей карты... а то подвесят игру, делаем все через код Оо, инвиз и прыжки юнитов, все все через код, только код... а то добавишь способность а она возмет и подвесит игру

бафф ты не добавишь через код - единственный способ через дамми юнитов, однако для адекватной загрузки дамми 90% всех его показателей должны быть на нуле, иначе вес самого дамми и загрузка процессора при его вызове хорошенько вырастет )


 

DarkVaderДата: Понедельник, 22 Ноября 2010, 05:22:25 | Сообщение # 45
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
потестил обе спела в тру режиме

мой способ дал результат 7\10
твой способ показал 9\10

но остается одно но, так как урон у нас наносится по разному, интересно насколько сработал бы твой спел, если наносить урон через проверку не находится ли юнит в группе уже поврежденных , а после нанесения урона добавлять их туда, и еще случайность перезаписи все таки есть и урон может нанести другой герой

кстати в твоем коде что бы снизить риск перезаписи переменной до 0, можно использовать массив
вырезать кучу бесполезного аля для нубов понятнее
и сделать что бы юнит наносил урон однократно и будет хорошо

и еще ты убедил с добавлением способности, опыт берет свое XDD только вот учусь я быстро, очень=)

 

FkoFFДата: Понедельник, 22 Ноября 2010, 05:34:09 | Сообщение # 46
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
DarkVader, можно сделать смеха ради небольшой скрипт что бы 15 героев с разницей в 0.01 запустили этот спелл. использовать без массива по хэндлу юнита (что бы можно было достать из условия, без создания лишней переменной типа "отряд")

И да, код можно хорошенько почистить, удалив десяток-два строк.


 

YrpoTRIaДата: Понедельник, 22 Ноября 2010, 11:19:55 | Сообщение # 47
9 уровень
Группа: Проверенные
Сообщений: 1002
Награды: 0
Репутация: 385
Блокировки:
Quote
Надо подключать второй триггер с событием "каждые 0.01 секунд" (хотя от этого глюки будут и лучше будет поставить все таки 0.1 или 0.2) и там уже выполнять нужные действия (главное в первом триггере поставить "вкл." и "выкл.")...

я бы так наверн спелл сделал...


Сообщение отредактировал YrpoTRIa - Понедельник, 22 Ноября 2010, 11:22:18
 

Pa3apTДата: Понедельник, 22 Ноября 2010, 13:03:54 | Сообщение # 48
8 уровень
Группа: Проверенные
Сообщений: 653
Награды: 0
Репутация: 166
Блокировки:
Гавно чё
 

DarkVaderДата: Понедельник, 22 Ноября 2010, 21:59:42 | Сообщение # 49
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (YrpoTRIa)
"каждые 0.01 секунд" (хотя от этого глюки будут и лучше будет поставить все таки 0.1 или 0.2)

ты еще каждую секунду поставь и будешь видеть как все двигается в подробностях, скорость для подобных спелов минимум 0.05 что составляет 20 кадров в секунду это минимальная граница визуально неприрывного движения, можно меньше но только что бы ускорить движение

 

Banzay89Дата: Четверг, 25 Ноября 2010, 20:16:10 | Сообщение # 50
9 уровень
Группа: Проверенные
Сообщений: 858
Награды: 1
Репутация: 77
Блокировки:
F.A.Q. для нубов! lol
 

Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » [Статья]Делаем заклинание как в доте(воденное перемещение)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz