XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
XyZoD

offline
Опыт: 2,073
Активность:
Я хочу переделать спелл
Вот я написал очередной спелл для своей карты. Но как и все остальные спеллы он слишком утечен... Мне нужен кто то опытный, который сможет его переписать так же, только с минимально возможным количеством утечек. Если кто то перепишет то я пойму принцип "не утекаемости", и напишу все свои спеллы без утечек. Кто сможет за это взятся? Спелл не большой.
Старый 01.02.2011, 00:04
Hanabishi
COOL STATUS
offline
Опыт: отключен
papapa071, эмм... а собственно сама карта где?
я телепат, транслируй мне свои мысли~~~~
Старый 01.02.2011, 00:11
XyZoD

offline
Опыт: 2,073
Активность:
Карта большая. Вот сам код.
Я не такой опытный джассер, как смог так написал.
globals
    group SN_G=null
    integer SN_A=0
    integer SN_S=0
    integer SN_I=0
    integer SN_S_ID=0
    integer SN_G_ID=0
    integer SN_MIN_R=0
    integer array SN_GR
    integer array SN_MAX_R
    real SN_X=0
    real SN_Y=0
    real SN_R=0
    real SN_D=0
    real SN_AOE=0
    real SN_SPEED=0
    real SN_PR=0
    real array SN_DA
    real array SN_REM
    timer SN_T=null
    unit SN_C=null
    string SN_M=null
endglobals

function SN_C00 takes nothing returns boolean
    return(IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()),GetOwningPlayer(SN_C))==true)and(GetWidgetLife​(GetFilterUnit())>0)and(IsUnitInGroup(GetFilterUnit(),SN_G)==false)and(IsUnitType(GetFilterUnit()​,UNIT_TYPE_STRUCTURE)==false)and(IsUnitType(GetFilterUnit(),UNIT_TYPE_MECHANICAL)==false)and(IsUnitT​ype(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)==false)
endfunction

function SN_A01 takes nothing returns nothing
    call GroupAddUnit(SN_G,GetEnumUnit())
    call UnitDamageTarget(SN_C,GetEnumUnit(),SN_DA[SN_S_ID],true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,​WEAPON_TYPE_WHOKNOWS)
endfunction

function SN_A00 takes nothing returns nothing
if(SN_R>SN_MAX_R[SN_S_ID]/3)then
    set SN_G_ID=0
endif
if(SN_R>SN_MAX_R[SN_S_ID]/2)then
    set SN_G_ID=1
endif
if(SN_R>SN_MAX_R[SN_S_ID]/1.4)then
    set SN_G_ID=2
endif
    if(GetWidgetLife(SN_C)>0)then
        if(SN_A==1)then
            if(SN_R<=SN_MAX_R[SN_S_ID])then
                set SN_R=SN_R+SN_SPEED
                set SN_I=1
                loop
                    exitwhen SN_I>SN_GR[SN_G_ID]
                    set SN_X=GetUnitX(SN_C)+Cos(SN_D*0.0174)*SN_R
                    set SN_Y=GetUnitY(SN_C)+Sin(SN_D*0.0174)*SN_R
                    set SN_D=SN_D+SN_REM[SN_G_ID]
                    call DestroyEffect(AddSpecialEffectLoc(SN_M,Location(SN_X,SN_Y)))
                    call ForGroup(GetUnitsInRangeOfLocMatching(SN_AOE,Location(SN_X,SN_Y),Condition(function SN_C00)),function SN_A01)
                    set SN_I=SN_I+1
                endloop
                if(SN_R>=SN_MAX_R[SN_S_ID])then
                    call GroupClear(SN_G)
                    set SN_A=0
                endif
            endif
        else
            set SN_R=SN_R-SN_SPEED
            set SN_I=1
            loop
                exitwhen SN_I>SN_GR[SN_G_ID]
                set SN_X=GetUnitX(SN_C)+Cos(SN_D*0.0174)*SN_R
                set SN_Y=GetUnitY(SN_C)+Sin(SN_D*0.0174)*SN_R
                set SN_D=SN_D+SN_REM[SN_G_ID]
                call DestroyEffect(AddSpecialEffectLoc(SN_M,Location(SN_X,SN_Y)))
                call ForGroup(GetUnitsInRangeOfLocMatching(SN_AOE,Location(SN_X,SN_Y),Condition(function SN_C00)),function SN_A01)
                set SN_I=SN_I+1
            endloop
            if(SN_R<=SN_MIN_R)then
            call PauseTimer(SN_T)
            call GroupClear(SN_G)
            call DestroyTimer(SN_T)
            call DestroyGroup(SN_G)
            set SN_C=null
            set SN_G=null
            set SN_T=null
            set SN_M=null
            endif
        endif    
    endif
endfunction

function SN_A02 takes nothing returns nothing
    //------------------------//Настройки 
    set SN_PR=.09             //Период обновления движения эффекта
    set SN_GR[0]=7            //Увеличение значения увеличивает плотность эффектов на расстоянии 0-33%.
    set SN_GR[1]=13           //Увеличение значения увеличивает плотность эффектов на расстоянии 33-66%.
    set SN_GR[2]=18           //Увеличение значения увеличивает плотность эффектов на расстоянии 66-100%.
    set SN_AOE=80             //Радиус поражения воинов от положения волны.
    set SN_MAX_R[1]=400       //Конечный индекс переменной должен быть равен максимальному уровню способносьти.
    set SN_MAX_R[2]=450       //Максимальное значение радиуса
    set SN_MAX_R[3]=500       //Максимальный радиус способносьти, где индекс массива уровень способносьти.
    set SN_MIN_R=120          //Минимальный радиус.
    set SN_S='A000'           //Какая способность должна примениться чтобы заклинание начало действия (Её равкод.(id)).
    set SN_DA[1]=100          //Урон способносьти, где индекс массива уровень способносьти.
    set SN_DA[2]=130          //Конечный индекс переменной должен быть равен максимальному уровню способносьти.
    set SN_DA[3]=160          //При не правильных настройках (Например: set SN_GR[2]=150) заклинание может вызвать неполадки.
    set SN_M="Abilities\\Spells\\Undead\\OrbOfDeath\\AnnihilationMissile.mdl" //Модель эффекта
    if(GetSpellAbilityId()==SN_S)then
    set SN_C=GetSpellAbilityUnit()
    set SN_S_ID=GetUnitAbilityLevel(SN_C,SN_S)
    set SN_SPEED=SN_MAX_R[SN_S_ID]/SN_MIN_R*5
    set SN_REM[0]=360/SN_GR[0]
    set SN_REM[1]=360/SN_GR[1]
    set SN_REM[2]=360/SN_GR[2]
    set SN_A=1
    set SN_R=SN_MIN_R
    set SN_G_ID=0
    set SN_D=0
    set SN_I=0
    call Preload(SN_M)
    set SN_T=CreateTimer()
    set SN_G=CreateGroup()
    call TimerStart(SN_T,SN_PR,true,function SN_A00)
    endif
endfunction

function InitTrig_SN takes nothing returns nothing
    local trigger t=CreateTrigger()
    local integer i=0
    loop
        call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
        set i=i+1
        exitwhen i==15
    endloop
    call TriggerAddAction(t,function SN_A02)
endfunction

Отредактировано ScorpioT1000, 01.02.2011 в 00:24.
Старый 01.02.2011, 00:14
ScorpioT1000
Работаем
offline
Опыт: отключен
Изменил название темы "Переделайте спелл" на более правильное.
Старый 01.02.2011, 00:25
Hanabishi
COOL STATUS
offline
Опыт: отключен
papapa071, утечек немерено +нечитаемый код
зачем создавать точки, если есть функции по координатам?
но так и быть, держи, исправил и привёл в читабельный вид:
globals
    group SN_G=null
    integer SN_A=0
    integer SN_S=0
    integer SN_I=0
    integer SN_S_ID=0
    integer SN_G_ID=0
    integer SN_MIN_R=0
    integer array SN_GR
    integer array SN_MAX_R
    real SN_X=0
    real SN_Y=0
    real SN_R=0
    real SN_D=0
    real SN_AOE=0
    real SN_SPEED=0
    real SN_PR=0
    real array SN_DA
    real array SN_REM
    timer SN_T=null
    unit SN_C=null
    string SN_M=null
endglobals

function SN_C00 takes nothing returns boolean
    return IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()),GetOwningPlayer(SN_C)) and not(GetWidgetLife(GetFilterUnit())>0)and(IsUnitInGroup(GetFilterUnit(),SN_G)) and not(IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE)) and not(IsUnitType(GetFilterUnit(),UNIT_TYPE_MECHANICAL)) and not(IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE))
endfunction

function SN_A01 takes nothing returns nothing
    call GroupAddUnit(SN_G,GetEnumUnit())
    call UnitDamageTarget(SN_C,GetEnumUnit(),SN_DA[SN_S_ID],true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,​WEAPON_TYPE_WHOKNOWS)
endfunction

function SN_A00 takes nothing returns nothing
    local group g = CreateGroup()
    if(SN_R>SN_MAX_R[SN_S_ID]/3)then
        set SN_G_ID=0
    endif

    if(SN_R>SN_MAX_R[SN_S_ID]/2)then
        set SN_G_ID=1
    endif

    if(SN_R>SN_MAX_R[SN_S_ID]/1.4)then
        set SN_G_ID=2
    endif
    
    if(GetWidgetLife(SN_C)>0)then
        if(SN_A==1)then
            if(SN_R<=SN_MAX_R[SN_S_ID])then
                set SN_R=SN_R+SN_SPEED
                set SN_I=1
                loop
                    exitwhen SN_I>SN_GR[SN_G_ID]
                    set SN_X=GetUnitX(SN_C)+Cos(SN_D*0.0174)*SN_R
                    set SN_Y=GetUnitY(SN_C)+Sin(SN_D*0.0174)*SN_R
                    set SN_D=SN_D+SN_REM[SN_G_ID]
                    call DestroyEffect(AddSpecialEffect(SN_M,SN_X,SN_Y))
                    call GroupEnumUnitsInRange(g,SN_X,SN_Y,SN_AOE,Filter(function SN_C00))
                    call ForGroup(g,function SN_A01)
                    call GroupClear(g)
                    set SN_I=SN_I+1
                endloop
                if(SN_R>=SN_MAX_R[SN_S_ID])then
                    call GroupClear(SN_G)
                    set SN_A=0
                endif
            endif
        else
            set SN_R=SN_R-SN_SPEED
            set SN_I=1
            loop
                exitwhen SN_I>SN_GR[SN_G_ID]
                set SN_X=GetUnitX(SN_C)+Cos(SN_D*0.0174)*SN_R
                set SN_Y=GetUnitY(SN_C)+Sin(SN_D*0.0174)*SN_R
                set SN_D=SN_D+SN_REM[SN_G_ID]
                call GroupEnumUnitsInRange(g,SN_X,SN_Y,SN_AOE,Filter(function SN_C00))
                call ForGroup(g,function SN_A01)
                call GroupClear(g)
                set SN_I=SN_I+1
            endloop
            if(SN_R<=SN_MIN_R)then
                call PauseTimer(SN_T)
                call GroupClear(SN_G)
                call DestroyTimer(SN_T)
                call DestroyGroup(SN_G)
                set SN_C=null
                set SN_G=null
                set SN_T=null
                set SN_M=null
            endif
        endif
    endif
    call DestroyGroup(g)
    set g = null
endfunction

function SN_A02 takes nothing returns nothing
    //------------------------Настройки (Установленные значения самые оптимальные) (Нельзя устанавливать значения ниже 0).
    set SN_PR=.09         //Период обновления движения эффекта (Если значение будет ниже .02 то возможны неполадки).
    set SN_GR[0]=7        //Увеличение значения увеличивает плотность эффектов на расстоянии 0-33%.
    set SN_GR[1]=13       //Увеличение значения увеличивает плотность эффектов на расстоянии 33-66%.
    set SN_GR[2]=18       //Увеличение значения увеличивает плотность эффектов на расстоянии 66-100%.
    set SN_AOE=80         //Радиус поражения воинов от положения волны.
    set SN_MAX_R[1]=400   //Конечный индекс переменной должен быть равен максимальному уровню способносьти.
    set SN_MAX_R[2]=450   //Максимальное значение радиуса (Рекомендованый максимум 720, иначе возможна неправильная работа).
    set SN_MAX_R[3]=500   //Максимальный радиус способносьти, где индекс массива уровень способносьти.
    set SN_MIN_R=120      //Минимальный радиус.
    set SN_S='A000'       //Какая способность должна примениться чтобы заклинание начало действия (Её равкод.(id)).
    set SN_DA[1]=100      //Урон способносьти, где индекс массива уровень способносьти.
    set SN_DA[2]=130      //Конечный индекс переменной должен быть равен максимальному уровню способносьти.
    set SN_DA[3]=160      //При не правильных настройках (Например: set SN_GR[2]=150) заклинание может вызвать неполадки.
    set SN_M="Abilities\\Spells\\Undead\\OrbOfDeath\\AnnihilationMissile.mdl" // Модель эффекта (Можете выбрать любую свою).
    //------------------------Остальное изменять не следует.
    if(GetSpellAbilityId()==SN_S)then
        set SN_C=GetSpellAbilityUnit()
        set SN_S_ID=GetUnitAbilityLevel(SN_C,SN_S)
        set SN_SPEED=SN_MAX_R[SN_S_ID]/SN_MIN_R*5
        set SN_REM[0]=360/SN_GR[0]
        set SN_REM[1]=360/SN_GR[1]
        set SN_REM[2]=360/SN_GR[2]
        set SN_A=1
        set SN_R=SN_MIN_R
        set SN_G_ID=0
        set SN_D=0
        set SN_I=0
        call Preload(SN_M)
        set SN_T=CreateTimer()
        set SN_G=CreateGroup()
        call TimerStart(SN_T,SN_PR,true,function SN_A00)
    endif
endfunction

function InitTrig_SN takes nothing returns nothing
    local trigger t=CreateTrigger()
    local integer i=0
    loop
        call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
        set i=i+1
        exitwhen i==15
    endloop
    call TriggerAddAction(t,function SN_A02)
endfunction
учись и читай статьи, может толк выйдет
Hanabishi добавил:
на работоспособность сам проверяй, делал с учётом, что это всё работает
Старый 01.02.2011, 00:31
XyZoD

offline
Опыт: 2,073
Активность:
Спелл рабочий 100%. Может ты знаеш какие нибудь статьи про хэш таблицы или про обнуления хэндлов? Уж очень хочется научиться убирать утечки...
Старый 01.02.2011, 00:35
ScorpioT1000
Работаем
offline
Опыт: отключен
xgm.ru/p/wc3/jass_introduction смотри мои вставки)
Старый 01.02.2011, 00:40
Hanabishi
COOL STATUS
offline
Опыт: отключен
поиск рулит
Старый 01.02.2011, 00:42
XyZoD

offline
Опыт: 2,073
Активность:
Всё это перечитывал раз по 5. Про хэш таблицы походу вообще нету статей. Ну вот только RB
function H2I takes handle h returns integer
 return h
 return 0
endfunction
Это связано с обнулением хэндла?
Старый 01.02.2011, 00:51
Hanabishi
COOL STATUS
offline
Опыт: отключен
papapa071, не читай про RB, начиная с версии 1.24 его больше не существует
Hanabishi добавил:
вот новая статья для новой версии её читай
Старый 01.02.2011, 00:53
XyZoD

offline
Опыт: 2,073
Активность:
Понятно...(
То есть придётся хэш таблицу применять? Или Локалки? Они помогут с утечками?
Старый 01.02.2011, 00:55
Hanabishi
COOL STATUS
offline
Опыт: отключен
papapa071, естественно в 95% без локалок и хеш не обойтись
хотя можно построить громадную систему массивов, но это просто тупо
Старый 01.02.2011, 00:58
XyZoD

offline
Опыт: 2,073
Активность:
Так что пошёл я практиковаться с хэш таблицами... Спасибо за внимание.
Старый 01.02.2011, 01:00
XOR

offline
Опыт: 38,159
Активность:
Hanabishi:
хотя можно построить громадную систему массивов, но это просто тупо
Ты как то странно значит их юзаешь, а для удобства при написании кода можно юзать структуры.
Старый 01.02.2011, 09:05
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 21:38.