Сейчас 15:04:33 Пятница, 29 марта, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Код
[Вопрос] Код
[HoBu4oK]Дата: Вторник, 09 Октября 2012, 12:04:48 | Сообщение # 1
4 уровень
Группа: Проверенные
Сообщений: 92
Награды: 0
Репутация: 9
Блокировки:
Code
scope EP2 initializer Init {

    private void SHOTMOVE(unit u,unit e,real dmg,real spd) {
        timer t = CreateTimer();int id = GetHandleId(t);
        SaveUnitHandle(Hash,id,0,u);SaveUnitHandle(Hash,id,1,e);SaveReal(Hash,id,2,dmg);SaveReal(Hash,id,3,spd);SaveReal(Hash,id,4,0.);
        TimerStart(t,.04,true,\
            lambda void() {
                timer t = GetExpiredTimer();int id = GetHandleId(t)
                unit u = LoadUnitHandle(Hash,id,0),e = LoadUnitHandle(Hash,id,1);
                real dmg = LoadReal(Hash,id,2),spd = LoadReal(Hash,id,3),d = LoadReal(Hash,id,4);
                real ang = Atan2(GetUnitY(e)-GetWidgetY(u),GetUnitX(e)-GetWidgetX(u)),maxdis =GetDistanceBetweenCoords(GetUnitX(e), GetWidgetX(u), GetUnitY(e), GetWidgetY(u));
                real x = GetWidgetX(u) + spd * Cos(ang),y = GetWidgetY(u) + spd * Sin(ang);
                if d <= maxdis {
                    SetUnitX(u,x);SetUnitY(u,y)
                } else {
                    TT(pc[GetPlayerId(GetOwningPlayer(u))]+I2S(R2I(dmg)),e);
                    unit dum = CreateUnit(GetOwningPlayer(u),'h002',x,y,0.);UnitAddAbility(dum,'A00N');IssueTargetOrderById(dum,852095,e);
                    UnitDamageTarget(u,e,dmg,true,false,null,null,null);RemoveUnit(u);
                    FlushChildHashtable(Hash,id);PauseTimer(t);DestroyTimer(t)
                }
                SaveReal(Hash,id,4,d+spd)
            }
        )
    }

    private bool COND_EP2()
    {
        return GetSpellAbilityId() == 'A00M'
    }

    private void ACT_EP2()
    {
        timer t=CreateTimer();int h=GetHandleId(t)
        unit u=GetTriggerUnit();real x=GetWidgetX(u);real y=GetWidgetY(u);real sek=6.28
        unit d=CreateUnit(GetOwningPlayer(u),'h00G',x+120.*Cos(1.),y+120.*Sin(1.),90.);bool pandatarg = FALSE
        SaveUnitHandle(Hash,h,0,d);SaveReal(Hash,h,1,sek);SaveReal(Hash,h,2,0);SaveUnitHandle(Hash,h,3,u);SaveBoolean(Hash,h,4,pandatarg)
        TimerStart(t,.04,true, \
            lambda void()  {
                timer t=GetExpiredTimer();integer h = GetHandleId(t);unit d = LoadUnitHandle(Hash,h,0),u = LoadUnitHandle(Hash,h,3);
                real sek = LoadReal(Hash,h,1);real f = LoadReal(Hash,h,2);bool pdtr = LoadBoolean(Hash,h,4);
                if f >= sek*3 {
                    for(unit e;UnitsInRange(GetUnitX(u),GetUnitY(u),650.)use TG) {
                        if IsUnitEnemy(e,GetOwningPlayer(u)) and IsUnitType(e,UNIT_TYPE_STRUCTURE)==false and GetWidgetLife(e)>.405 && !IsUnitType(e, UNIT_TYPE_MAGIC_IMMUNE)
                        {
                            SHOTMOVE(d,e,GetHeroStr(u,true),25.)
                            pdtr = true
                        }
                    }
                    if pdtr == false {
                        RemoveUnit(d)
                    }
                    FlushChildHashtable(Hash,h);PauseTimer(t);DestroyTimer(t)
                } else {
                    f+=.34
                    SetUnitX(d,GetWidgetX(u)+90.*Cos(f+90.-25.12));SetUnitY(d,GetWidgetY(u)+90.*Sin(f+90.-25.12))
                }
                SaveReal(Hash,h,2,f)
            }
        )
    }

    private void Init()
    {
        set gg_trg_EartPanda2 = CreateTrigger(  )
        call TriggerRegisterAnyUnitEventBJ( gg_trg_EartPanda2, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddCondition( gg_trg_EartPanda2, Condition( function COND_EP2 ) )
        call TriggerAddAction( gg_trg_EartPanda2, function ACT_EP2 )
    }
}

У меня 2-а вопроса.
  • Код утечный?
  • Как сделать чтобы дамик долетал до юнита e , в функции SHOTMOVE()
    скорее всего, код, не читобелен :D

    Сообщение отредактировал SirNikolas - Вторник, 09 Октября 2012, 13:20:31
  •  

    Ty3uKДата: Вторник, 09 Октября 2012, 12:18:53 | Сообщение # 2
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    Отредачь плиз сообщение
    хотя бы просто пробел в конец поставь
    а то код обрывается, если смотреть с телефона


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 12:21:40 | Сообщение # 3
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    scope EP2 initializer Init {

    private void SHOTMOVE(unit u,unit e,real dmg,real spd) {
    timer t = CreateTimer();int id = GetHandleId(t);
    SaveUnitHandle(Hash,id,0,u);SaveUnitHandle(Hash,id,1,e);SaveReal(Hash,id,2,dmg);SaveReal(Hash,id,3,spd);SaveReal(Hash,id,4,0.);
    TimerStart(t,.04,true,\
    lambda void() {
    timer t = GetExpiredTimer();int id = GetHandleId(t)
    unit u = LoadUnitHandle(Hash,id,0),e = LoadUnitHandle(Hash,id,1);
    real dmg = LoadReal(Hash,id,2),spd = LoadReal(Hash,id,3),d = LoadReal(Hash,id,4);
    real ang = Atan2(GetUnitY(e)-GetWidgetY(u),GetUnitX(e)-GetWidgetX(u)),maxdis =GetDistanceBetweenCoords(GetUnitX(e), GetWidgetX(u), GetUnitY(e), GetWidgetY(u));
    real x = GetWidgetX(u) + spd * Cos(ang),y = GetWidgetY(u) + spd * Sin(ang);
    if d <= maxdis {
    SetUnitX(u,x);SetUnitY(u,y)
    } else {
    TT(pc[GetPlayerId(GetOwningPlayer(u))]+I2S(R2I(dmg)),e);
    unit dum = CreateUnit(GetOwningPlayer(u),'h002',x,y,0.);UnitAddAbility(dum,'A00N');IssueTargetOrderById(dum,852095,e);
    UnitDamageTarget(u,e,dmg,true,false,null,null,null);RemoveUnit(u);
    FlushChildHashtable(Hash,id);PauseTimer(t);DestroyTimer(t)
    }
    SaveReal(Hash,id,4,d+spd)
    })
    }

    private bool COND_EP2()
    {
    return GetSpellAbilityId() == 'A00M'
    }

    private void ACT_EP2()
    {
    timer t=CreateTimer();int h=GetHandleId(t)
    unit u=GetTriggerUnit();real x=GetWidgetX(u);real y=GetWidgetY(u);real sek=6.28
    unit d=CreateUnit(GetOwningPlayer(u),'h00G',x+120.*Cos(1.),y+120.*Sin(1.),90.);bool pandatarg = FALSE
    SaveUnitHandle(Hash,h,0,d);SaveReal(Hash,h,1,sek);SaveReal(Hash,h,2,0);SaveUnitHandle(Hash,h,3,u);SaveBoolean(Hash,h,4,pandatarg)
    TimerStart(t,.04,true, \
    lambda void() {
    timer t=GetExpiredTimer();integer h = GetHandleId(t);unit d = LoadUnitHandle(Hash,h,0),u = LoadUnitHandle(Hash,h,3);
    real sek = LoadReal(Hash,h,1);real f = LoadReal(Hash,h,2);bool pdtr = LoadBoolean(Hash,h,4);
    if f >= sek*3 {
    for(unit e;UnitsInRange(GetUnitX(u),GetUnitY(u),650.)use TG) {
    if IsUnitEnemy(e,GetOwningPlayer(u)) and IsUnitType(e,UNIT_TYPE_STRUCTURE)==false and GetWidgetLife(e)>.405 && !IsUnitType(e, UNIT_TYPE_MAGIC_IMMUNE)
    {
    SHOTMOVE(d,e,GetHeroStr(u,true),25.)
    pdtr = true
    }
    }
    if pdtr == false {
    RemoveUnit(d)
    }
    FlushChildHashtable(Hash,h);PauseTimer(t);DestroyTimer(t)
    } else {
    f+=.34
    SetUnitX(d,GetWidgetX(u)+90.*Cos(f+90.-25.12));SetUnitY(d,GetWidgetY(u)+90.*Sin(f+90.-25.12))
    }
    SaveReal(Hash,h,2,f)
    })
    }

    private void Init()
    {
    set gg_trg_EartPanda2 = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_EartPanda2, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_EartPanda2, Condition( function COND_EP2 ) )
    call TriggerAddAction( gg_trg_EartPanda2, function ACT_EP2 )
    }
    }
     

    Ty3uKДата: Вторник, 09 Октября 2012, 12:37:52 | Сообщение # 4
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    пока не могу ничего понять, но

    вместо инициализатора можно заюзать callback onUnitSpellEffect()

    при регистрации события EVENT_PLAYER_* можно юзать не GetOwningPlayer(GetTriggerUnit()), а GetTriggerPlayer()

    А так да, код очень сложно читать


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 12:58:34 | Сообщение # 5
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    Ty3uK, который в под code'ом читается чуть легче, просто после вставки пробелы убрались.
     

    SirNikolasДата: Вторник, 09 Октября 2012, 13:21:08 | Сообщение # 6
    Группа: Модераторы
    Сообщений: 6729
    Награды: 1
    Репутация: 1867
    Блокировки:
    Расставил табуляцию.

     

    Ty3uKДата: Вторник, 09 Октября 2012, 13:26:04 | Сообщение # 7
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    Один черт вот так выглядит


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек


    Сообщение отредактировал Ty3uK - Вторник, 09 Октября 2012, 13:28:30
     

    lawsonДата: Вторник, 09 Октября 2012, 13:57:45 | Сообщение # 8
    Группа: Проверенные
    Сообщений: 3482
    Награды: 0
    Репутация: 974
    Блокировки:
    [HoBu4oK], зачем тебе сЖасс, ты что дестроишь глобальные триггеры или импортишь свои наработки?
    Пиши плиз каждое действие на отдельно строке а не нескольео на одной, от этого ты умней не становишься и код этим не оптимизируешь.


    Nic nie wiem bo mam chuj.
    редактирую посты! ВСЕ!
     

    Ty3uKДата: Вторник, 09 Октября 2012, 14:13:16 | Сообщение # 9
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    а синтаксис и плюшки?

    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 14:14:47 | Сообщение # 10
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    lawson, причём тут это? Мне так удобнее писать.
     

    Ty3uKДата: Вторник, 09 Октября 2012, 15:16:12 | Сообщение # 11
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    [HoBu4oK], увеличь скорость движения, тогда исчезать будет ближе к цели

    Стал более очевидным местами. Заюзал коллбэк, местами выпилил лишние сохранения в хэш.
    И, бтв, что делает функция TT?

    Добавлено (09 Октября 2012, 15:16:12)
    ---------------------------------------------
    И еще: если ты пишешь на cJass, юзай только его синтаксис, не смешивай с классическим JASS2, иначе получается тихий ужас.
    К примеру, у тебя на одной строчке было if cond and cond 2 && cond3 (это грубый пример, показывающий конструкцию)


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек


    Сообщение отредактировал Ty3uK - Вторник, 09 Октября 2012, 15:12:53
     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 15:18:27 | Сообщение # 12
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    Quote (Ty3uK)
    TT

    Tex Tag
    Quote (Ty3uK)
    увеличь скорость движения, тогда исчезать будет ближе к цели

    Не мне надо именно чтобы до цели долетел и умер.

    Добавлено (09 Октября 2012, 15:18:27)
    ---------------------------------------------

    Quote (|HoBu4oK|)
    И еще: если ты пишешь на cJass, юзай только его синтаксис, не смешивай с классическим JASS2, иначе получается тихий ужас.
    К примеру, у тебя на одной строчке было if cond and cond 2 && cond3 (это грубый пример, показывающий конструкцию)

    Привычки)
     

    Ty3uKДата: Вторник, 09 Октября 2012, 15:21:45 | Сообщение # 13
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    Quote (|HoBu4oK|)
    Не мне надо именно чтобы до цели долетел и умер.

    Ну вот ты же и сравниваешь через GetDistanceBetweenCoords (где-то я ее видел... : D )
    Насколько раньше (или позже) исчезает?


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 15:29:51 | Сообщение # 14
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    Quote (Ty3uK)
    Насколько раньше (или позже) исчезает?

    Умирает, дамик, в 1-ой точке юнита, тобишь, где 1-ый X,Y, до оттуда долетает, идёт стан и урон, а цель уже может быть в далеко от 1-ого X,Y
    Quote (Ty3uK)
    Ну вот ты же и сравниваешь через GetDistanceBetweenCoords (где-то я ее видел... : D )

    Ну да у тебя в наработке : D, не давно нашел, а теперь юзаю, а до этого(месяц назад где-то или 2) юзал SquareRoot, но что-то слишком тошный он, большой)
     

    Ty3uKДата: Вторник, 09 Октября 2012, 15:35:48 | Сообщение # 15
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    [HoBu4oK], посмотри это, там вроде с этим все в порядке

    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    SirNikolasДата: Вторник, 09 Октября 2012, 16:31:51 | Сообщение # 16
    Группа: Модераторы
    Сообщений: 6729
    Награды: 1
    Репутация: 1867
    Блокировки:
    Quote (|HoBu4oK|)
    юзал SquareRoot, но что-то слишком тошный он, большой)
    Глупая отговорка.
    P. S. Юзаем IsUnitInRange/IsUnitInRangeXY.


     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 16:42:33 | Сообщение # 17
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    SquareRoot((GetWidgetX(t) - GetWidgetX(d)) * (GetWidgetX(t) - GetWidgetX(d)) + (GetWidgetY(t) - GetWidgetY(d)) * (GetWidgetY(t) - GetWidgetY(d)))
    Quote (SirNikolas)
    Глупая отговорка.

    Ну немаленький, да?) Или GetDistanceBetweenCoords
     

    Ty3uKДата: Вторник, 09 Октября 2012, 16:53:02 | Сообщение # 18
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    [HoBu4oK], где суть одна и та же :D
    Можно еще так:
    Code
    #define <GetDist(x1, y1, x2, y2)> = SquareRoot((x2 -x1) * (x2 -x1) + (y2 -y1) * (y2 - y1))

    И вызывать как функцию

    Ну да ты вроде говорил, что знаешь Си


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 17:24:53 | Сообщение # 19
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    Quote (Ty3uK)

    Ну да ты вроде говорил, что знаешь Си

    Говорил, что чутка, и #define ну юзаю, только если
    Code
    define {
    private SPEED = 30.
    private DIST = 500.
    {
     

    Ty3uKДата: Вторник, 09 Октября 2012, 17:40:42 | Сообщение # 20
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    [HoBu4oK], зря, макросы - крутая вещь
    Особенно в таких местах, где лишний вызов можно и не юзать :)


    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    [HoBu4oK]Дата: Вторник, 09 Октября 2012, 18:45:53 | Сообщение # 21
    4 уровень
    Группа: Проверенные
    Сообщений: 92
    Награды: 0
    Репутация: 9
    Блокировки:
    Ty3uK, не то-что не юзаю, просто, не замечал\не знал.
     

    Ty3uKДата: Вторник, 09 Октября 2012, 18:58:13 | Сообщение # 22
    Группа: Ветераны
    Сообщений: 6125
    Награды: 2
    Репутация: 1617
    Блокировки:
    [HoBu4oK], specially for you

    ╭∩╮(︶︿︶)╭∩╮
    "Ульта Тайда мне в жопу!" © k0fe1n
    Статьи: MUI-1|MUI-2|Шрифт
    Полезности: JASP|JNGP|Уголок библиотек
     

    SirNikolasДата: Среда, 10 Октября 2012, 10:45:45 | Сообщение # 23
    Группа: Модераторы
    Сообщений: 6729
    Награды: 1
    Репутация: 1867
    Блокировки:
    Quote (|HoBu4oK|)
    SquareRoot((GetWidgetX(t) - GetWidgetX(d)) * (GetWidgetX(t) - GetWidgetX(d)) + (GetWidgetY(t) - GetWidgetY(d)) * (GetWidgetY(t) - GetWidgetY(d)))
    Промежуточные значения сохранять в переменные не модно?
    Code
    real dx = GetWidgetX(t) - GetWidgetX(d), dy = GetWidgetY(t) - GetWidgetY(d);
    if dx * dx + dy * dy < 50000. /* 500^2 */ {
        //...
    }
    А вообще
    Code
    if IsUnitInRange(t, d, 500.) {
        //...
    }


     

    Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Код
    • Страница 1 из 1
    • 1
    Поиск:

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